ManageTreeXml类封装QTreeWidget 树形节点信息

QDomDocument 运用说明

    • 生成示例
    • 头文件
    • 源文件

生成示例

<?xml version="1.0" encoding="UTF-8"?>
<sdk guid="##GUID"><in method="SetModbusParaInfo"><Device name="Device1"><mode updateCycUnit="ms" timeOutUnit="ms" resendTimes="3" timeOut="0" updateCyc="100" deviceId="1" value="2"/><eth netmask="255.255.255.0" ip="192.168.90.245" port="10000"/><serial serial="COM1" dataBits="8" baudRate="9600" parity="NONE" stopBit="1"/><register offset="1" func="0" name="Para0" dataFormat="0"/><register offset="1" func="0" name="Para1" dataFormat="0"/></Device></in>
</sdk>

头文件

#ifndef MANAGETREEXML_H
#define MANAGETREEXML_H
#include <QTreeWidget>
#include <QDomDocument>typedef struct RegisterPara {RegisterPara() {func_ = "0";offset_ = "1";dataFormat_ = "0";}QString func_;QString offset_;QString dataFormat_;
}RegisterPara;
Q_DECLARE_METATYPE(RegisterPara)typedef struct DevicePara {DevicePara() {mode_ = "0";deviceId_ = "1";updateCyc_ = "100";updateCycUnit_ = "ms";timeOut_ = "0";timeOutUnit_ = "ms";resendTimes_ = "3";serial_ = "COM1";baudRate_ = "9600";dataBits_ = "8";stopBit_ = "1";parity_ = "NONE";ipAddress_ = "192.168.90.245";netmask_ = "255.255.255.0";port_ = "10000";}QString mode_;QString deviceId_;QString updateCyc_;QString updateCycUnit_;QString timeOut_;QString timeOutUnit_;QString resendTimes_;QString serial_;QString baudRate_;QString dataBits_;QString stopBit_;QString parity_;QString ipAddress_;QString netmask_;QString port_;QHash<QString, RegisterPara*> registerPara_;
}DevicePara;
Q_DECLARE_METATYPE(DevicePara)enum ItemType {DeviceEnum = QTreeWidgetItem::UserType,RegisterEnum
};class ManageTreeXml
{
public:ManageTreeXml();bool SaveTreeXml(QTreeWidget* pTree, QString xmlPath);bool LoadTreeXml(QTreeWidget* pTree, QString xmlPath);private:bool showXml(QTreeWidget* pTree, QDomDocument *pDoc, bool bEditable);bool showXmlTreeNode(QTreeWidget* pTree, QDomNode domParent, QTreeWidgetItem *treeParent, bool bEditable);void setTreeNodeText(QDomNode Node, QTreeWidgetItem *treeNode, DevicePara* devicePara);void SaveItem(QDomElement& root,QTreeWidgetItem* item,QDomDocument& doc);
};#endif // MANAGETREEXML_H

源文件

#include "manageTreexml.h"
#include <QStack>
#include <QFile>
#include <QDebug>ManageTreeXml::ManageTreeXml()
{}bool ManageTreeXml::SaveTreeXml(QTreeWidget *pTree, QString xmlPath)
{QDomDocument doc;QDomProcessingInstruction head = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");doc.appendChild(head);//invisibleRootItem()函数并不是得到我们想要的这个顶层节点,它得到的是所有节点的最终根节点,因此,得到顶层节点需要自己写操作,下面是根据任意一个节点获取其可见顶层节点的代码QTreeWidgetItem *rootItem = pTree->invisibleRootItem(); //树的根节点QDomElement sdk = doc.createElement("sdk");sdk.setAttribute("guid", "##GUID");doc.appendChild(sdk);QDomElement root= doc.createElement("in");root.setAttribute("method", "SetModbusParaInfo");sdk.appendChild(root);SaveItem(root, rootItem, doc);QFile file(xmlPath);if (!file.open(QIODevice::WriteOnly)) {return false;}QString xml = doc.toString();QTextStream txtOutput(&file);txtOutput.setCodec("UTF-8");txtOutput<<xml;file.close();return true;
}bool ManageTreeXml::LoadTreeXml(QTreeWidget *pTree, QString xmlPath)
{pTree->clear();if(xmlPath.isEmpty()) {return false;}QDomDocument* doc = new QDomDocument;QFile fl(xmlPath);if(!doc->setContent(&fl)) {fl.close();return false;}fl.close();showXml(pTree, doc, false);return false;
}bool ManageTreeXml::showXml(QTreeWidget* pTree, QDomDocument* pDoc, bool bEditable)
{if(pDoc == NULL) {return false;}QDomElement docElem = pDoc->documentElement();QDomNode domIn = docElem.firstChild();if (!domIn.isNull()) {QDomElement inElem = domIn.toElement();QDomNodeList list = inElem.childNodes();for (int i = 0; i< list.count();i++){QDomNode node = list.at(i);QTreeWidgetItem* it = new QTreeWidgetItem(ItemType::DeviceEnum);if(bEditable) {it->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);}if ((node.toElement().tagName() == "Device")&& (node.toElement().attributes().contains("name"))) {it->setText(0, node.toElement().attribute("name"));pTree->addTopLevelItem(it);showXmlTreeNode(pTree, node.firstChild() ,it, bEditable);}}}pTree->expandAll();return true;
}bool ManageTreeXml::showXmlTreeNode(QTreeWidget* pTree, QDomNode domParent ,QTreeWidgetItem* treeParent, bool bEditable)
{DevicePara dp;while(!domParent.isNull()) {QTreeWidgetItem* it = new QTreeWidgetItem(ItemType::RegisterEnum);if(bEditable) {it->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);}setTreeNodeText(domParent ,it, &dp);if (domParent.toElement().tagName() == "register"&& (domParent.toElement().attributes().contains("name"))) {it->setText(0, domParent.toElement().attribute("name"));treeParent->addChild(it);} else {delete it;it = NULL;}// if(domParent.hasChildNodes()) {//     showXmlTreeNode(pTree, domParent.firstChild() ,it, bEditable);// }domParent = domParent.nextSibling();}treeParent->setData(0, Qt::UserRole, QVariant::fromValue(dp));return true;
}void ManageTreeXml::setTreeNodeText(QDomNode Node ,QTreeWidgetItem* treeNode, DevicePara* devicePara)
{if(treeNode == NULL) {return;}//qDebug() << "ItemText:" << Node.toElement().tagName();if (Node.toElement().tagName() == "mode") {devicePara->mode_ = Node.toElement().attribute("value");devicePara->deviceId_ = Node.toElement().attribute("deviceId");devicePara->updateCyc_ = Node.toElement().attribute("updateCyc");devicePara->updateCycUnit_ = Node.toElement().attribute("updateCycUnit");devicePara->timeOut_ = Node.toElement().attribute("timeOut");devicePara->timeOutUnit_ = Node.toElement().attribute("timeOutUnit");devicePara->resendTimes_ = Node.toElement().attribute("resendTimes");} else if (Node.toElement().tagName() == "eth") {devicePara->ipAddress_ = Node.toElement().attribute("ip");devicePara->netmask_ = Node.toElement().attribute("netmask");devicePara->port_ = Node.toElement().attribute("port");} else if (Node.toElement().tagName() == "serial") {devicePara->serial_ = Node.toElement().attribute("serial");devicePara->baudRate_ = Node.toElement().attribute("baudRate");devicePara->dataBits_ = Node.toElement().attribute("dataBits");devicePara->stopBit_ = Node.toElement().attribute("stopBit");devicePara->parity_ = Node.toElement().attribute("parity");} else if (Node.toElement().tagName() == "register") {RegisterPara tp;tp.func_ = Node.toElement().attribute("func");tp.offset_ = Node.toElement().attribute("offset");tp.dataFormat_ = Node.toElement().attribute("dataFormat");treeNode->setData(0, Qt::UserRole + 1, QVariant::fromValue(tp));}
}void ManageTreeXml::SaveItem(QDomElement& root, QTreeWidgetItem *item, QDomDocument& doc)
{QDomElement ele;int countChild = item->childCount();for (int i = 0; i < countChild; i++) {QTreeWidgetItem *childItem = item->child(i);if (childItem->type() == ItemType::DeviceEnum) {ele = doc.createElement("Device");QString itemTxt = childItem->text(0);ele.setAttribute("name", itemTxt);DevicePara dp = childItem->data(0, Qt::UserRole).value<DevicePara>();QDomElement mode = doc.createElement("mode");mode.setAttribute("value",dp.mode_);mode.setAttribute("deviceId", dp.deviceId_);mode.setAttribute("updateCyc", dp.updateCyc_);mode.setAttribute("updateCycUnit", dp.updateCycUnit_);mode.setAttribute("timeOut", dp.timeOut_);mode.setAttribute("timeOutUnit", dp.timeOutUnit_);mode.setAttribute("resendTimes", dp.resendTimes_);ele.appendChild(mode);QDomElement eth = doc.createElement("eth");eth.setAttribute("ip", dp.ipAddress_);eth.setAttribute("netmask", dp.netmask_);eth.setAttribute("port", dp.port_);ele.appendChild(eth);QDomElement serial = doc.createElement("serial");serial.setAttribute("serial", dp.serial_);serial.setAttribute("baudRate", dp.baudRate_);serial.setAttribute("dataBits", dp.dataBits_);serial.setAttribute("stopBit", dp.stopBit_);serial.setAttribute("parity", dp.parity_);ele.appendChild(serial);} else if(childItem->type() == ItemType::RegisterEnum) {ele = doc.createElement("register");RegisterPara dp = childItem->data(0, Qt::UserRole + 1).value<RegisterPara>();QString itemTxt = childItem->text(0);ele.setAttribute("name", itemTxt);ele.setAttribute("func", dp.func_);ele.setAttribute("offset", dp.offset_);ele.setAttribute("dataFormat", dp.dataFormat_);}root.appendChild(ele);SaveItem(ele,childItem,doc);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/40661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基于PyQt5和卷积神经网络分类模型(ResNet50分类算法)实现生活垃圾分类系统GUI界面项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 在当今社会&#xff0c;随着人们对环境保护意识的增强以及科技的快速发展&#xff0c;智能化的垃圾分类…

EasyBoss ERP移动端上线数据分析模块,随时查Shopee/TikTok本土店数据

前段时间&#xff0c;EasyBoss ERP出了个超酷炫的数字大屏功能&#xff0c;广受好评。 但是也有老板说&#xff0c;电脑端看数据不够方便啊&#xff0c;你们EasyBoss有本事上个手机就能看数据的功能啊&#xff01; 说干就干&#xff0c;直接满足你们的需求&#xff01; 于是在…

day02-统计数据

numpy统计学 1.求平均值[数组名.mean()/np.mean(数组名)] m1 np.arange(20).reshape((4,5))m1.mean() #9.5若想要求某一维的平均值&#xff0c;设置axis参数&#xff0c;多维数组元素指定&#xff1a; axis 0&#xff0c;将从上往下计算。axis 1&#xff0c;将从左往右计算…

EtherCAT主站IGH-- 7 -- IGH之dict_request.h/c文件解析

EtherCAT主站IGH-- 7 -- IGH之dict_request.h/c文件解析 0 预览一 该文件功能`dict_request.c` 文件功能函数预览二 函数功能介绍1. `ec_dict_request_init`2. `ec_dict_request_read`详细分析三 h文件翻译四 c文件翻译该文档修改记录:总结0 预览 一 该文件功能 该文件定义了…

44 mysql batch insert 的实现

前言 我们这里 来探讨一下 insert into $fields values ($values1), ($values2), ($values3); 的相关实现, 然后 大致来看一下 为什么 他能这么快 按照 我的思考, 应该里里面有 批量插入才对, 但是 调试结果 发现令我有一些意外 呵呵 果然 只有调试才是唯一的真理 相比于 …

pyecharts可视化案例大全(1~10)

pyecharts可视化案例大全 一、堆叠柱状图二、关闭坐标轴显示三、自定义坐标轴标签文本四、更改坐标轴数据类型五、双Y轴【直方图&折线图】六、直方图——双Y轴七、折线图——双X轴八、图例选择设置单选九、缩略轴——inside组件十、缩略轴——slider组件一、堆叠柱状图 不…

Linux的Socket开发概述

套接字&#xff08;socket&#xff09;是 Linux 下的一种进程间通信机制&#xff08;socket IPC&#xff09;&#xff0c;在前面的内容中已经给大家提到过&#xff0c;使用 socket IPC 可以使得在不同主机上的应用程序之间进行通信&#xff08;网络通信&#xff09;&#xff0c…

MATLAB和Python发那科ABB库卡史陶比尔工业机器人模拟示教框架

&#x1f3af;要点 &#x1f3af;模拟工业机器人 | &#x1f3af;可视化机器人DH 参数&#xff0c;机器人三维视图 | &#x1f3af;绘制观察运动时关节坐标位置、速度和加速度 | &#x1f3af;绘制每个关节处的扭矩和力 | &#x1f3af;图形界面示教机器人 | &#x1f3af;工业…

Qt入门小项目 | WPS tab页面(无边框窗口综合应用)

文章目录 一、手写代码实现WPS tab页面 一、手写代码实现WPS tab页面 实现类似WPS tab效果&#xff0c;具体包含&#xff1a; 自定义标题栏&#xff1a;最大、最小、关闭在QTabWidget的tab上增加控件在QTabWidget的tab上右键菜单可拖拽移动可拉伸窗口双击标题栏在最大与正常间…

centos部署Nginx并配置网页进行访问

1. 安装 Nginx 安装 EPEL 仓库 EPEL (Extra Packages for Enterprise Linux) 仓库提供了许多不在 CentOS 基础仓库中的软件包&#xff0c;包括 Nginx。 sudo yum install epel-release -y#安装 Nginx sudo yum install nginx -y 2. 启动 Nginx 并设置开机启动 sudo system…

ECCV2024|AIGC(图像生成,视频生成,3D生成等)相关论文汇总(附论文链接/开源代码)【持续更新】

ECCV2024&#xff5c;AIGC相关论文汇总&#xff08;如果觉得有帮助&#xff0c;欢迎点赞和收藏&#xff09; Awesome-ECCV2024-AIGC1.图像生成(Image Generation/Image Synthesis)Accelerating Diffusion Sampling with Optimized Time StepsAnyControl: Create Your Artwork w…

Objection 对命令的批量操作

假定现在需要对好多不同的类进行批量hook&#xff0c;逐个hook非常繁琐&#xff0c;那么可以要将这些hook的类放到一个文件里&#xff0c;并且在这些类的前面加上hook命令&#xff0c;内容如下 使用如下命令执行该文件中的命令 objection -g 测试 explore -c d:/hookData/toHoo…

git上传本地单独修改的文件_git 只推送变化的文件

git上传本地单独修改的文件_git 只推送变化的文件-CSDN博客 只推送本地修改的文件&#xff0c;这篇文章方法可行。

昇思25天学习打卡营第13天|ResNet50图像分类

1. 学习内容复盘 图像分类是最基础的计算机视觉应用&#xff0c;属于有监督学习类别&#xff0c;如给定一张图像(猫、狗、飞机、汽车等等)&#xff0c;判断图像所属的类别。本章将介绍使用ResNet50网络对CIFAR-10数据集进行分类。 ResNet网络介绍 ResNet50网络是2015年由微软…

传承与创新,想让认字更简单?就来看《米小圈动画汉字》吧!

汉字&#xff0c;作为中华文化的精髓和根基&#xff0c;自古以来便承载着中华民族的思想与记忆。在现代社会&#xff0c;随着文化多样性的崛起和科技进步的推动&#xff0c;汉字的教育也更加的多元化&#xff0c;《米小圈动画汉字》作为一项全新的教育资源&#xff0c;不仅致力…

Postman介绍

Postman 是一款流行的 API 开发和测试工具&#xff0c;它提供了一个直观的用户界面&#xff0c;使开发者可以轻松地构建、测试和修改 HTTP 请求。Postman 不仅适用于测试人员&#xff0c;也广泛应用于开发人员、产品经理和API设计者中&#xff0c;以确保API的正确性和性能。 以…

删除账户相关信息

功能需求 获取正确的待删除账户名杀死系统中正在运行的属于该账户的进程确认系统中属于该账户的所有文件删除该账户 1. 获取正确的待删除账户名 #让用户输入账户名 read -t 10 -p "please input account name: " accountif [ -z $account ] thenecho "account…

【python基础】—calendar模块

文章目录 前言一、calendar模块方法1.firstweekday()2.setfirstweekday(firstweekday)3.isleap(year)4.leapdays(y1, y2)5.weekday(year, month, day)6.monthrange(year, month)7.weekheader(n)8.monthcalendar(year, month)9.prmonth(theyear, themonth, w0, l0)10.prcal(year…

【硬核科普】存算一体化系统(Processing-in-Memory, PIM)深入解析

文章目录 0. 前言1. 提出背景1.1 存储墙1.2 功耗墙 2. 架构方案2.1 核心特征2.2 技术实现2.2.1 电流模式2.2.2 电压模式2.2.3 模式选择 2.3 PIM方案优势 3. 应用场景4. 典型产品4.1 鸿图H304.2 三星HBM-PIM 5. 存算一体化缺点6. 总结 0. 前言 按照国际惯例&#xff0c;首先声明…

c++类模板及应用

文章目录 为什么要有函数模板一般实现举例类模板举例 继承中类模板的使用特殊情况 友元函数模板类和静态成员类模板实践 为什么要有函数模板 项目需求: 实现多个函数用来返回两个数的最大值&#xff0c;要求能支持char类型、int类型、double 一般实现举例 类模板举例 继承中类…