Qt处理xml文件
来源:互联网 发布:c语言scanf用法 编辑:程序博客网 时间:2024/05/23 01:59
Qt处理xml文件
注意:
①项目的pro文件
QT +=core gui\ xml //这里要加上xml
②包含头文件
#include <QtXml/QDomNode>
如果头文件只是#include ,执行构建步骤的时候会报错 error: QtXml: No such file or directory
如果在pro文件中没有加上xml,会报出大量的错误。
③关于构建和重新构建
以下是在网上看到的
qmake,根据实际环境创建项 目文件.pro 并且运行qmake生成适当的Makefile
构建:构建是增量编译,只编译有变化部分
重新构建: 是把所有部分都重新编译
运行: 有改动则根据已有的Makefile进行编译,执行
构建和重新构建时如果没有Makefile,会根据.pro文件等生成Makefile后再编译
所以,有时候自己删除了pro中的一点东西,构建之后发现并没有报错,其实是因为增量编译。错误还是在里面的。
直接上代码
dialog.h
#ifndef DIALOG_H#define DIALOG_H#include <QDialog>#include <QLineEdit>#include <QGridLayout>#include <QMessageBox>#include <QtXml/QDomNode>#include <QTextBrowser>#include <QDebug>#include <QDialog>class Dialog : public QDialog{ Q_OBJECTpublic: Dialog(QWidget *parent = 0); QList<QString> namelist;//建立一个list存储从xml文件中读取到的标签名字 ~Dialog();private: QPushButton *fileBtn; QLineEdit *fileLineEdit; QTextBrowser *textBrowser; QGridLayout *mainLayout; void parse(QString file_name);private slots: void showfile();};#endif // DIALOG_H
dialog.cpp
#include "dialog.h"#include <QGridLayout>#include <QFileDialog>#include <QPushButton>Dialog::Dialog(QWidget *parent) : QDialog(parent){ setWindowTitle(tr("xml查错工具")); fileBtn=new QPushButton; fileBtn->setText(tr("打开xml文件夹")); fileLineEdit=new QLineEdit; textBrowser=new QTextBrowser; textBrowser->setText("标签名"); mainLayout=new QGridLayout(this); mainLayout->addWidget(fileBtn,0,0); mainLayout->addWidget(fileLineEdit,0,1); mainLayout->addWidget(textBrowser,1,0); connect(fileBtn,SIGNAL(clicked()),this,SLOT(showfile()));}Dialog::~Dialog(){}void Dialog::showfile(){ namelist.clear();//每次调用此函数之前都将存储name的列表清空 QString file_path = QFileDialog::getExistingDirectory(this,"请选择xml路径...","/"); if(file_path.isEmpty()) { return; }else{ fileLineEdit->setText(file_path); } QDir filedir(file_path); filedir.setFilter(QDir::Files); QFileInfoList filelist=filedir.entryInfoList() ; int file_count=filelist.count(); if(file_count <=0) return; QStringList string_list; for(int i=0;i<file_count;i++) { QFileInfo file_info = filelist.at(i); QString suffix = file_info.suffix();//匹配后缀名 if(QString::compare(suffix, QString("xml"), Qt::CaseInsensitive) == 0) { QString absolute_file_path = file_info.absoluteFilePath(); qDebug()<<"filename:"<<absolute_file_path; parse(absolute_file_path); } } if(namelist.size()==0) { textBrowser->append("未找到name标签,你是不是文件夹错误?"); } for ( int k=0; k!=namelist.size(); ++k ) { textBrowser->append(namelist.at(k)); } textBrowser->append("***********************************");}void Dialog::parse(QString file_name){ //static QList<QString> namelist;//建立一个list存储从xml文件中读取到的标签名字 if(file_name.isEmpty()) return; qDebug()<<"parse_OK"; QFile file(file_name); if(!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::information(NULL, QString("title"), QString("open error!")); return; } QDomDocument document; QString error; int row = 0, column = 0; if(!document.setContent(&file, false, &error, &row, &column)) { QMessageBox::information(NULL, QString("title"), QString("parse file failed at line row and column") + QString::number(row, 10) + QString(",") + QString::number(column, 10)); return; } file.close(); if(document.isNull()) { QMessageBox::information(NULL, QString("title"), QString("document is null!")); return; } QDomElement root = document.documentElement(); //root_tag_name为annotation QString root_tag_name = root.tagName(); qDebug()<<"root_name:"<<root_tag_name; if(root.hasAttribute("annotation")) { qDebug()<<"hasAttribute:annotation"; //name为Qt QString name = root.attributeNode("name").value(); } // QDomElement person = root.firstChildElement(); if(person.isNull()) return; QString person_tag_name = person.tagName(); //获取子节点数目 QDomNodeList list = root.childNodes(); int count = list.count(); qDebug()<<"子节点数目:"<<count; for(int i=0; i<count;i++) { QDomNode dom_node = list.item(i); QDomElement element = dom_node.toElement(); if(element.tagName()=="object") { QDomNodeList child_list = element.childNodes(); int child_count = child_list.count(); for(int j=0; j<child_count;j++) { QDomNode child_dom_node = child_list.item(j); QDomElement child_element = child_dom_node.toElement(); if(child_element.tagName()=="name") { QString child_tag_name = child_element.tagName(); QString child_tag_value = child_element.text(); qDebug()<<"child_tag_name:"<<child_tag_value; if(!namelist.contains(child_tag_value)) { qDebug()<<"contains"; namelist<<child_tag_value; } } } } }}
好吧,写代码都是有套路的,现在就把这个套路整理下。
①先写头文件,规划一下布局界面中需要哪些控件,我们这个界面需要button,textedit,textbrower,gridlayout。所以在头文件中先声明。
QPushButton *fileBtn; QLineEdit *fileLineEdit; QTextBrowser *textBrowser; QGridLayout *mainLayout;
②然后在cpp文件中完成布局分配。
setWindowTitle(tr("xml查错工具"));//设置窗口的标题 fileBtn=new QPushButton;//new一个按钮对象 fileBtn->setText(tr("打开xml文件夹"));//设置按钮属性,也就是按钮上显示的字 fileLineEdit=new QLineEdit;//new一个显示栏 textBrowser=new QTextBrowser;//new一个大的显示栏 textBrowser->setText("标签名");//大显示栏的第一行标题 mainLayout=new QGridLayout(this);//new一个布局管理器 mainLayout->addWidget(fileBtn,0,0);//将按钮放在第一行第一列的位置。这里0,0就是第一行第一列 mainLayout->addWidget(fileLineEdit,0,1);//将小显示栏放在第一行第二列 mainLayout->addWidget(textBrowser,1,0);//将大显示栏放在第二行第一列 connect(fileBtn,SIGNAL(clicked()),this,SLOT(showfile()));//将按钮的点击信号与槽函数关联起来
③剩下的就是编写实现功能的逻辑代码了。槽函数。
0 0
- Qt处理xml文件
- Qt的XML文件处理
- 用Qt中的QDomDocument类处理XML文件
- 搞搞QT4(思维导图版):QT处理XML文件
- 用Qt中的QDomDocument类处理XML文件
- 用Qt中的QDomDocument类处理XML文件
- 用Qt中的QDomDocument类处理XML文件
- 用Qt中的QDomDocument类处理XML文件
- 用 Qt 中的 QDomDocument类 处理 XML 文件(下)
- 用 Qt 中的 QDomDocument类 处理 XML 文件(上)
- Qt 生成 xml 文件
- Qt 读写XML文件
- QT 读写Xml文件
- Qt生成XML文件
- Qt写xml文件
- qt解析xml文件
- qt 读取xml文件
- QT 写XML文件
- 《东邪西毒》
- 互联网协议基础
- ARM开发板 | 最初的想法
- 65. Valid Number
- mysql服务无法启动 服务没有报告任何错误解决方法
- Qt处理xml文件
- 为什么要用Fragment.setArguments(Bundle bundle)来传递参数
- java反射详解
- webstorm10 配置less
- bzoj 3698: XWW的难题 (有源汇有上下界的最大流)
- 17-Oracle入门之表的管理
- C++不常用关键字
- 小程序制作回到顶部按钮
- linux安装jdk后发现系统带有openjdk的处理