Qt处理xml文件
2017-01-08 14:10
323 查看
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_OBJECT public: 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()));//将按钮的点击信号与槽函数关联起来
③剩下的就是编写实现功能的逻辑代码了。槽函数。
相关文章推荐
- 解决Qt5 Creator无法切换输入法(fcitx),Ubuntu中不能使用搜狗输入法录入汉字问题(转载)
- Qt学习4之QStackedWidget
- Qt学习3之QDockWidget
- Qt学习2之QSplitter类的理解
- Qt框架浅析之五 ------ Qt内存管理和事件循环
- QT开发(三十八)——Model/View框架编程
- Qt c++与QML混合编程
- 发布Qt带Widgets程序过程
- QT中QVector报错“index out of range”
- QTP/UFT引用外部dll的3种方法
- 1,Qt开发环境的搭建
- qt代码生成label
- Qt框架浅析之四 ------ 界面单继承QWidget
- qt 错误记录
- QT5 中的信号与槽新的写法
- Qt 获取按下按键的内容
- Qt下图像自定义显示控件
- Qt中数据模块学习
- Qt 多线程和网络编程学习
- Qt框架浅析之三 ------ Qt元对象系统(二)