【标题】XML编辑工具
【开发环境】Qt 5.2.0
【概要设计】使用QT的视图/模型结构、treeview控件以树形结构显示所要操作的XML文件,并实现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 *parent); Node(QString nodeName, QString nodeText); Node(); ~Node(); QString nodeName; QString nodeText; Node *parent; QList<Node *> children; }; #endif // NODE_H
model类继承自QAbstractItemModel类,按照Qt模型的要求实现相应的函数
data函数:如果是第一列则显示节点名,如果是第二列,则显示节点的值
QModelIndex Model::index(int row, int column, const QModelIndex &parent) const { || column < ) return QModelIndex(); Node *parentNode = nodeFromIndex(parent); Node *childNode = parentNode->children.value(row); if (!childNode) return QModelIndex(); return createIndex(row, column, childNode); } QVariant Model::data(const QModelIndex &index, int role) const { if (role != Qt::DisplayRole) return QVariant(); Node *node = nodeFromIndex(index); ) return node->nodeName; ) return node->nodeText; }
xml::read函数将读取到的XML元素名和元素值依次赋值给node节点的nodename和nodetext
Node* Xml::read(QDomDocument doc) { QDomElement docElem = doc.documentElement(); QDomNode n = docElem.firstChild(); QString rootText = ""; Node *rootNode = new Node(n.parentNode().toElement().tagName(), rootText); while(n.isElement()) { QString nodeName = n.toElement().tagName(); QString nodeText = n.toElement().text(); if(n.hasChildNodes()) nodeText = ""; Node *node = new Node(nodeName, nodeText, rootNode); rootNode->children += node; if(n.hasChildNodes()) trealChild(n, node); n = n.nextSibling(); } return rootNode; }