此文是读取和存储已知结构的xml,对于未知结构的xml,可以用递归方法读取和遍历。可参考文章:Qt遍历不规则树的节点

1、QTreewidget设置

 //折叠图标(三角图标)换成自定义图标
ui->treeWidget->setStyleSheet("QTreeView::branch:has-children:!has-siblings:closed,\
QTreeView::branch:closed:has-children:has-siblings{border-image: none; image: url(:/images/plus.png);}\
QTreeView::branch:open:has-children:!has-siblings,\
QTreeView::branch:open:has-children:has-siblings{border-image: none; image: url(:/images/minus.png);}");

2、显示保存xml

头文件

#ifndef PROCESSDEVICEXML_H
#define PROCESSDEVICEXML_H #include <QObject>
#include <QDomElement>
#include <QTreeWidget>
#include "public.h" #define ManageDeviceStr "ManageDevice"
#define SystemStr "System"
#define SubSystemStr "SubSystem"
#define DeviceStr "Device"
#define NameStr "name"
#define TypeStr "type"
#define DeviceXmlName "DeviceItem.xml" class ProcessDeviceXml : public QObject
{
Q_OBJECT public:
explicit ProcessDeviceXml(QObject *parent = nullptr); bool OpenXml(QString fileName, QList<DeviceInfo>& listDev, QTreeWidget* pTreeWg = NULL);
void ShowXml(QDomElement &docElem, QList<DeviceInfo> &listDev, QTreeWidget *treeWg);
bool SaveXML(QString fileName, QTreeWidget *pTreeWg); bool AddTreeItem(QTreeWidget *pTreeWg, QTreeWidgetItem *clickedItem, int itemType);
bool delTreeItem(QTreeWidget *pTreeWg, QTreeWidgetItem *clickedItem, int nType);
signals: public slots: private: }; #endif // PROCESSDEVICEXML_H

  源文件:

显示图标时,要换成自己的图标路径;如果出现编译不通过,需要根据情况修改一下。

#include "processdevicexml.h"
#include <QTextStream>
#include <QMessageBox>
#include <QFile>
#include <QDebug>
#include "public.h"
#include "adddevicedlg.h"
#include "extern.h" ProcessDeviceXml::ProcessDeviceXml(QObject *parent) : QObject(parent)
{ } bool ProcessDeviceXml::OpenXml(QString fileName, QList<DeviceInfo>& listDeviceName, QTreeWidget* pTreeWg)
{
QFile file(fileName);
if (file.open(QIODevice::ReadOnly))
{
QDomDocument dom;
QString errorStr;
int errorLine;
int errorCol;
if (!dom.setContent(&file, true, &errorStr, &errorLine, &errorCol))
{
qDebug() << errorStr << "line: " << errorLine << "col: " << errorCol;
file.close();
return false;
}
else
{
pTreeWg->clear();
QDomElement docElem = dom.documentElement();
ShowXml(docElem, listDeviceName, pTreeWg);
pTreeWg->expandAll();
}
file.close();
return true;
}
else {
file.close();
return false;
} } void ProcessDeviceXml::ShowXml(QDomElement& docElem, QList<DeviceInfo>& listDev, QTreeWidget* treeWg)
{
//根节点
QTreeWidgetItem *projectItem = new QTreeWidgetItem(treeWg);
QString projectName = docElem.attribute(NameStr);
projectItem->setText(0, projectName);
projectItem->setData(0, Qt::UserRole, QString::number(TypeProject));
projectItem->setIcon(0, QIcon(QStringLiteral(":/image/system.png")));
projectItem->setWhatsThis(0, SystemStr); listDev.clear(); QDomNode systemNode = docElem.firstChild();
while (!systemNode.isNull())
{
DeviceInfo devInfo;
devInfo.listDevName.clear();
QDomElement elementSystem = systemNode.toElement(); // try to convert the node to an element.
if (elementSystem.tagName() == QStringLiteral(SystemStr))
{
QTreeWidgetItem *systemItem = new QTreeWidgetItem(projectItem);
//系统节点
QString strSystemName = elementSystem.attribute(NameStr);
devInfo.qstrSystemName = strSystemName;
systemItem->setText(0, strSystemName);
systemItem->setData(0, Qt::UserRole, QString::number(TypeSystem));
systemItem->setIcon(0, QIcon(QStringLiteral(":/image/system.png")));
systemItem->setWhatsThis(0, SystemStr); //子系统节点
QDomNode subsystemNode = systemNode.firstChild();
while (!subsystemNode.isNull())
{
QDomElement elementDev = subsystemNode.toElement();
if (elementDev.tagName() == QStringLiteral(SubSystemStr))
{
QString strDevName = elementDev.attribute(NameStr); QTreeWidgetItem *subsystemItem = new QTreeWidgetItem(systemItem);
subsystemItem->setText(0, strDevName);
subsystemItem->setIcon(0, QIcon(QStringLiteral(":/image/subSystem.png")));
subsystemItem->setData(0, Qt::UserRole, QString::number(TypeSubsystem));
subsystemItem->setWhatsThis(0, SubSystemStr); QDomNode devNode = subsystemNode.firstChild();
while (!devNode.isNull())
{
QDomElement elementDev = devNode.toElement();
if (elementDev.tagName() == QStringLiteral(DeviceStr))
{
QString strDevName = elementDev.attribute(NameStr);
QTreeWidgetItem *devItem = new QTreeWidgetItem(subsystemItem);
devItem->setText(0, strDevName);
devItem->setIcon(0, QIcon(QStringLiteral(":/Qimage/device.png")));
devItem->setWhatsThis(0, DeviceStr);
devItem->setData(0, Qt::UserRole, QString::number(TypeDevice));
devInfo.listDevName.push_back(strDevName);
}
devNode = devNode.nextSibling();
}
}
subsystemNode = subsystemNode.nextSibling();
}
}
//下一个分组节点
listDev.push_back(devInfo);
systemNode = systemNode.nextSibling();
} return;
} bool ProcessDeviceXml::SaveXML(QString fileName, QTreeWidget* pTreeWg)
{
QTreeWidgetItem *rootItem = pTreeWg->invisibleRootItem(); //树的根节点
int countSystem = rootItem->childCount();
if (countSystem <= 0) //列表树没有项
{
return false;
} QFile db(fileName);
if (!db.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; //只写方式打开,并清空以前的信息
QDomDocument doc;
QDomProcessingInstruction instruction;
instruction = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
doc.appendChild(instruction); QDomElement root = doc.createElement(ManageDeviceStr);
QString projectName = p_globalObject->getProjectName();
QDomAttr elementProjAttr = doc.createAttribute(NameStr);
elementProjAttr.setValue(projectName);
root.setAttributeNode(elementProjAttr);
doc.appendChild(root); //添加根元素 QTreeWidgetItem* projectItem = rootItem->child(0);
countSystem = projectItem->childCount();
for (int i = 0; i < countSystem; i++)
{
QTreeWidgetItem *systemItem = projectItem->child(i);
QString systemName = systemItem->text(0);
QDomElement elementSystem = doc.createElement(SystemStr);
QDomAttr elementSystemAttr = doc.createAttribute(NameStr);
elementSystemAttr.setValue(systemName);
elementSystem.setAttributeNode(elementSystemAttr);
root.appendChild(elementSystem); int countSubsystem = systemItem->childCount();
for (int j = 0; j < countSubsystem; j++)
{
QTreeWidgetItem *subsystemItem = systemItem->child(j);
QDomElement elementSubsystem = doc.createElement(SubSystemStr); //子系统项属性name
QString subsystemName = subsystemItem->text(0);
QDomAttr elementSubsystemNameAttr = doc.createAttribute(NameStr);
elementSubsystemNameAttr.setValue(subsystemName);
elementSubsystem.setAttributeNode(elementSubsystemNameAttr); elementSystem.appendChild(elementSubsystem); int coutDev = subsystemItem->childCount();
for (int k = 0; k < coutDev; k++)
{
QTreeWidgetItem *devItem = subsystemItem->child(k);
QString devName = devItem->text(0);
QDomElement elementChn = doc.createElement(DeviceStr);
QDomAttr elementChnAttr = doc.createAttribute(NameStr);
elementChnAttr.setValue(devName);
elementChn.setAttributeNode(elementChnAttr);
elementSubsystem.appendChild(elementChn);
}
}
} QTextStream out(&db);
out.setCodec("UTF-8");
doc.save(out, 4);
db.close(); return true;
} bool ProcessDeviceXml::AddTreeItem(QTreeWidget* pTreeWg, QTreeWidgetItem* clickedItem, int itemType)
{
QString qstrCaption;
int nType = TypeDevice;
switch (itemType) {
case TypeProject://添加系统
qstrCaption = "添加系统";
nType = TypeSystem;
break;
case TypeSystem://添加分系统
qstrCaption = "添加子系统";
nType = TypeSubsystem;
break;
case TypeSubsystem://添加设备
case TypeDevice:
qstrCaption = "添加设备";
nType = TypeDevice;
break;
default:
break;
} AddDeviceDlg dlg;
dlg.SetCaption(qstrCaption); if(dlg.exec() == QDialog::Rejected){
return false;
} QString txt = dlg.GetTxt();
QTreeWidgetItem *item = new QTreeWidgetItem(clickedItem);
item->setText(0, txt);
item->setData(0, Qt::UserRole, QString::number(nType));
item->setIcon(0, QIcon(QStringLiteral(":image/group.png")));
item->setWhatsThis(0, qstrCaption); pTreeWg->expandItem(clickedItem); return true;
}

  

qtreewidget 显示保存xml文件的更多相关文章

  1. c# 键值数据保存XML文件

    /// <summary> /// 键值数据保存XML文件 /// </summary> /// <param name="fileName"> ...

  2. linq to xml 简单的增、删、改、查、保存xml文件操作

    using System; using System.Collections; using System.Configuration; using System.Data; using System. ...

  3. 第四十六篇--解析和保存xml文件

    新建assets资源文件夹,右键app --> new --> Folder --> Assets Folder,将info.xml放入此文件夹下面. info.xml <?x ...

  4. C# 读取保存xml文件

    直接读取xml文件中的内容 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(result); XmlNode root = xmlDoc. ...

  5. 使用dataview组件显示服务器端xml文件数据

    来自<sencha touch权威指南>,约193页开始 ------------------------------------- (1)app.js代码: Ext.require([' ...

  6. 使用DOM解析XML文件,、读取xml文件、保存xml、增加节点、修改节点属性、删除节点

    使用的xml文件 <?xml version="1.0" encoding="GB2312" ?> <PhoneInfo> <Br ...

  7. 提取数据表保存为XML文件

    //连接数据库 SqlConnection con = new SqlConnection("server=****;database=****;uid=sa;pwd=********&qu ...

  8. php对xml文件进行CURD操作

    XML是一种数据存储.交换.表达的标准: - 存储:优势在于半结构化,可以自定义schema,相比关系型二维表,不用遵循第一范式(可以有嵌套关系): - 交换:可以通过schema实现异构数据集成: ...

  9. C#操作XML学习之创建XML文件的同时新建根节点和子节点(多级子节点)

    最近工作中遇到一个问题,要求创建一个XML文件,在创建的时候要初始化该XML文档,同时该文档打开后是XML形式,但是后缀名不是.在网上找了好些资料没找到,只能自己试着弄了一下,没想到成功了,把它记下来 ...

随机推荐

  1. Win10看图总有遮挡?如何找回好用的照片查看器

    来,大家日常在电脑上查看图片是用什么软件?老牌的ACDSee.XXX看图王.美图看看还是Win系统自带的呢?反正小编在没什么特殊需要的时候,只用系统自带,免除安装.功能够用,想要进行处理也能用Win自 ...

  2. node中controller的get和post方法获取参数

    1.get: const body = ctx.query; // get请求   2.post: const body = ctx.request.body; // post请求

  3. caffe 安装

    安装caffe 拉取镜像 nvidia/cuda:9.0-cudnn7-devel-centos7 1,换源 安装https://blog.csdn.net/tuomen5867/article/de ...

  4. C2MIF软件使用说明

    1.右击---管理员身份运行 2.打开文件txt---搞定!

  5. BZOJ 4821: [Sdoi2017]相关分析 线段树 + 卡精

    考试的时候切掉了,然而卡精 + 有一个地方忘开 $long long$,完美挂掉 $50$pts. 把式子化简一下,然后直接拿线段树来维护即可. Code: // luogu-judger-enabl ...

  6. 苹果cms v10官网下载

    苹果CMS程序是一套采用PHP+MYSQL环境下运行的完善而强大的快速建站系统.经过近多年的开发经验和技术积累,苹果CMS程序已逐步走向成熟,在易用性和功能上已经成为同行中的佼佼者.程序体积小-> ...

  7. Android中StatFs获取系统/sdcard存储(剩余空间)大小

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  8. SQL Server 分割字符串和合并多条数据为一行

    分割字符串函数 create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(col varchar(20) ...

  9. esLint——规范你的代码(转)

    团队协作时,若是团队的代码风格统一,能够大大减少沟通成本. 什么是 ESLint ? ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码 ...

  10. Hive、Spark优化案例

    一.Join原则 将条目少的表/子查询放在Join的左边.原因:在Join的reduce阶段,位于Join左边的表的内容会被加载进内存,条目少的表放在左边,可以减少发生内存溢出的几率. 小表关联大表: ...