这与以前写的一篇文章类似: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 }