【标题】XML编辑工具
【开发环境】Qt 5.2.0, C++
【概要设计】使用QT的视图/模型结构、treeview控件以树形结构显示所要操作的XML文件,并实现修改和保存功能
【详细设计】
主要包含 node.h(节点类)、model.h(模型类)、xml.h(xml操作类)
node.h文件
使用两个Qstring字符串变量作为类成员,分别用于表示XML文件的节点名和节点值,一个Node节点表示父节点和一个Qlist列表用于存储孩子节点
#ifndef NODE_H #define NODE_H #include <QList> #include <QString> class Node { public: Node(QString Nodename, QString Nodetext); Node(); ~Node(); QString Nodename; QString Nodetext; Node *parent; QList<Node *> children; }; #endif // NODE_H
构造函数:
8 Node::Node() 9 { 10 this->Nodename = ""; 11 this->Nodetext = ""; 12 parent = 0; 13 }
model.h文件
继承自QAbstractItemModel类,按照Qt模型的要求实现相应的函数
#ifndef MODEL_H #define MODEL_H #include <QAbstractItemModel> #include "node.h" class Model : public QAbstractItemModel { public: Model(QObject *parent = 0); ~Model(); void setRootNode(Node *node); QModelIndex index(int row, int column, const QModelIndex &parent) const; QModelIndex parent(const QModelIndex &child) const; int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role) const; private: Node *nodeFromIndex(const QModelIndex &index) const; Node *rootNode; };
data函数,如果是第一列则显示节点名,如果是第二列,则显示节点的值
1 QVariant Model::data(const QModelIndex &index, int role) const 2 { 3 if (role != Qt::DisplayRole) 4 return QVariant(); 6 Node *node = nodeFromIndex(index); 8 if (index.column() == 0) 9 return node->Nodename; 10 else if (index.column() == 1) 11 return node->Nodetext; 12 } 13
将XML加载到内存中
QFile file("F:/538.xml"); if(!file.open(QIODevice::ReadOnly)) { QMessageBox::information(this, tr("error!"), "open file faild!"); } QDomDocument doc; if(!doc.setContent(&file)) { file.close(); QMessageBox::information(this, tr("error!"), "add xml faild!"); } file.close();
将XML读取到模型中
将读取到的XML元素名和元素值依次赋值给node节点的nodename和nodetext
QDomNode n = doc.documentElement().firstChild(); while(!n.isNull()) { QDomElement e = n.toElement(); Node *node = new Node(); node->Nodename = n.toElement().tagName(); node->Nodetext = n.toElement().text(); RootNode->children += node; if(n.hasChildNodes()) { treal(n, node); } n = n.nextSibling(); }
修改XML
将点击treeview视图时产生的索引转换成节点,用一个label控件和一个lineEdit控件分别显示节点名和节点值
当用户将lineEidt中内容编辑完成时点击Update按钮,将lineEdit的文本信息赋值给模型中所要编辑节点的nodetext;
1 void MainWindow::on_treeView_clicked(const QModelIndex &index) 2 { 3 Node *node = new Node(); 4 node = static_cast<Node *>(index.internalPointer()); 5 ui->label->setText(node->Nodename + ":"); 6 ui->lineEdit->setText(node->Nodetext); 7 totalindex = index; 8 } 9 10 void MainWindow::on_Update_clicked() 11 { 12 Node *node = new Node(); 13 node = static_cast<Node *>(totalindex.internalPointer()); 14 node->Nodetext = ui->lineEdit->text(); 15 QDomNodeList list = doc.elementsByTagName(node->Nodename); 16 list.at(0).setNodeValue(ui->lineEdit->text()); 17 18 }
时间: 2024-11-05 02:35:16