这与以前写的一篇文章类似:https://www.cnblogs.com/warmlight/p/12033459.html。不同的是这篇文章是读取xml文件,将xml 的tagname做为树节点的text,保存时完全按照树节点的text保存。

说明:首先在pro文件中 添加 QT += xml。对于本例子中的对话框中,一个树控件,两个按钮。如果想把示例中的xml信息完全放到树上,那就需要自己做点什么了。另外,加载xml文件时,是绝对路径。如果不知道怎么改,我觉得你需要回炉深造一下~~

不说太多了,把源码贴上去。

ManageTreeXml.cpp

  1 #include "ManageTreeXml.h"
  2 #include <QStack>
  3 #include <QFile>
  4 #include <QDebug>
  5 
  6 #define TREE_LINK_TYPE          "LINKPORT_TYPE"
  7 #define TREE_PACKAGE_TYPE       "PACKAGE_TYPE"
  8 
  9 ManageTreeXml::ManageTreeXml()
 10 {
 11 }
 12 
 13 bool ManageTreeXml::SaveTreeXml(QTreeWidget *pTree, QString xmlPath)
 14 {
 15     QDomDocument doc;
 16     QDomProcessingInstruction head = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
 17     doc.appendChild(head);
 18     //invisibleRootItem()函数并不是得到我们想要的这个顶层节点,它得到的是所有节点的最终根节点,因此,得到顶层节点需要自己写操作,下面是根据任意一个节点获取其可见顶层节点的代码
 19     QTreeWidgetItem *rootItem = pTree->invisibleRootItem(); //树的根节点
 20     QTreeWidgetItem* childItem = rootItem->child(0);
 21 
 22     QString strRoot;
 23     strRoot = childItem->text(0);
 24     QDomElement root = doc.createElement(strRoot);
 25     doc.appendChild(root);
 26 
 27     SaveItem(root, childItem, doc);
 28 
 29     QFile file(xmlPath);
 30     if (!file.open(QIODevice::WriteOnly)){
 31         return false;
 32     }
 33     QString xml = doc.toString();
 34     QTextStream txtOutput(&file);
 35     txtOutput.setCodec("UTF-8");
 36     txtOutput<<xml;
 37     file.close();
 38 
 39     return true;
 40 }
 41 
 42 bool ManageTreeXml::LoadTreeXml(QTreeWidget *pTree, QString xmlPath)
 43 {
 44     pTree->clear();
 45 
 46     if(xmlPath.isEmpty())   return false;
 47 
 48     QDomDocument* doc = new QDomDocument;
 49     QFile fl(xmlPath);
 50     if(!doc->setContent(&fl)){
 51         fl.close();
 52         return false;
 53     }
 54     fl.close();
 55 
 56     showXml(pTree, doc,false);
 57 
 58     return false;
 59 }
 60 
 61 bool ManageTreeXml::showXml(QTreeWidget* pTree, QDomDocument* pDoc, bool bEditable)
 62 {
 63     if(pDoc == NULL)    return false;
 64 
 65 //    QDomNodeList RootLst =  pDoc->elementsByTagName(XML_ROOT);
 66 //    QDomNode root = RootLst.item(0);
 67 
 68     QDomElement docElem = pDoc->documentElement();
 69 
 70     QTreeWidgetItem* it = new QTreeWidgetItem;
 71     if(bEditable){
 72         it->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
 73     }
 74 //    qDebug() << root.toElement().tagName();
 75     it->setText(0 ,docElem.tagName());
 76     pTree->addTopLevelItem(it);
 77 
 78     showXmlTreeNode(pTree, docElem.firstChild() ,it, bEditable);
 79 
 80     pTree->expandAll();
 81     return true;
 82 }
 83 
 84 bool ManageTreeXml::showXmlTreeNode(QTreeWidget* pTree, QDomNode domParent ,QTreeWidgetItem* treeParent, bool bEditable)
 85 {
 86     while(!domParent.isNull()){
 87         QTreeWidgetItem* it = new QTreeWidgetItem;
 88         if(bEditable){
 89             it->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
 90         }
 91         setTreeNodeText(domParent ,it);
 92         treeParent->addChild(it);
 93         if(domParent.hasChildNodes()){
 94             showXmlTreeNode(pTree, domParent.firstChild() ,it, bEditable);
 95         }
 96         domParent = domParent.nextSibling();
 97     }
 98     return true;
 99 }
100 
101 void ManageTreeXml::setTreeNodeText(QDomNode Node ,QTreeWidgetItem* treeNode)
102 {
103     if(treeNode == NULL)    return;
104 
105     treeNode->setText(0 ,Node.toElement().tagName());
106 //    qDebug() << "ItemText:" << Node.toElement().tagName();
107 
108     QString treeType = TREE_PACKAGE_TYPE;
109     if(treeType == TREE_LINK_TYPE)
110     {
111 //        treeNode->setText(1 ,Node.toElement().attribute("portName"));
112 //        treeNode->setText(2 ,Node.toElement().attribute("portDesc"));
113 //        treeNode->setText(3 ,Node.toElement().attribute("portType"));
114 //        treeNode->setText(4 ,Node.toElement().attribute("portIP"));
115 //        treeNode->setText(5 ,Node.toElement().attribute("portOrBaudRate"));
116     }
117     else if(treeType == TREE_PACKAGE_TYPE)
118     {
119 //        treeNode->setText(1 ,Node.toElement().attribute("Value"));
120 //        treeNode->setText(2 ,Node.toElement().attribute("Name"));
121 //        treeNode->setText(3 ,Node.toElement().attribute("Index"));
122 //        treeNode->setText(4 ,Node.toElement().attribute("Type"));
123 //        treeNode->setText(5 ,Node.toElement().attribute("Len"));
124 //        treeNode->setText(6 ,Node.toElement().attribute("Desc"));
125     }
126 }
127 
128 
129 void ManageTreeXml::SaveItem(QDomElement& root, QTreeWidgetItem *item, QDomDocument& doc)
130 {
131     int countChild = item->childCount();
132     for (int i = 0; i < countChild; i++)
133     {
134         QTreeWidgetItem *childItem = item->child(i);
135         QString itemTxt = childItem->text(0);
136         QDomElement ele = doc.createElement(itemTxt);
137         root.appendChild(ele);
138 
139         SaveItem(ele,childItem,doc);
140     }
141 }
View Code

相关文章: