当前位置: 首页 > news >正文

QT 多级嵌套结构体,遍历成员--半自动。<模板+宏定义>QTreeWidget树结构显示

Qt的QTreeWidget来显示嵌套结构体的成员,并以树形结构展示。
在这里插入图片描述

#include <QApplication>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QString>
#include <cstdint>// 假设这些是你的结构体定义
struct BaseMeterParam_Type {int param1;float param2;
};struct NetParam_Type {QString ipAddress;int port;
};struct TimingUploadParam_Type {int interval;bool enabled;
};struct LadderParam_Type {int stepCount;float stepValue;
};struct DeviceParam_Type {BaseMeterParam_Type mt_BaseMeter;NetParam_Type mt_Net;TimingUploadParam_Type mt_TimingUpload;LadderParam_Type mt_RunLadder;uint16_t m_None;uint16_t m_Crc16;
};// 模板函数,用于将结构体成员添加到树中
template<typename T>
void addMemberToTree(QTreeWidgetItem* parent, const QString& name, const T& value) {QTreeWidgetItem* item = new QTreeWidgetItem(parent);item->setText(0, name);item->setText(1, QString::number(value));
}// 特化模板函数,用于处理QString
template<>
void addMemberToTree<QString>(QTreeWidgetItem* parent, const QString& name, const QString& value) {QTreeWidgetItem* item = new QTreeWidgetItem(parent);item->setText(0, name);item->setText(1, value);
}// 特化模板函数,用于处理bool
template<>
void addMemberToTree<bool>(QTreeWidgetItem* parent, const QString& name, const bool& value) {QTreeWidgetItem* item = new QTreeWidgetItem(parent);item->setText(0, name);item->setText(1, value ? "true" : "false");
}// 宏定义,用于遍历结构体成员
#define ADD_MEMBER_TO_TREE(parent, member) addMemberToTree(parent, #member, deviceParam.member)// 定义一个函数来遍历DeviceParam_Type的成员并添加到树中
void traverseDeviceParamToTree(QTreeWidget* tree, const DeviceParam_Type& deviceParam) {QTreeWidgetItem* root = tree->invisibleRootItem();// 添加mt_BaseMeter成员QTreeWidgetItem* mt_BaseMeterItem = new QTreeWidgetItem(root);mt_BaseMeterItem->setText(0, "mt_BaseMeter");ADD_MEMBER_TO_TREE(mt_BaseMeterItem, mt_BaseMeter.param1);ADD_MEMBER_TO_TREE(mt_BaseMeterItem, mt_BaseMeter.param2);// 添加mt_Net成员QTreeWidgetItem* mt_NetItem = new QTreeWidgetItem(root);mt_NetItem->setText(0, "mt_Net");ADD_MEMBER_TO_TREE(mt_NetItem, mt_Net.ipAddress);ADD_MEMBER_TO_TREE(mt_NetItem, mt_Net.port);// 添加mt_TimingUpload成员QTreeWidgetItem* mt_TimingUploadItem = new QTreeWidgetItem(root);mt_TimingUploadItem->setText(0, "mt_TimingUpload");ADD_MEMBER_TO_TREE(mt_TimingUploadItem, mt_TimingUpload.interval);ADD_MEMBER_TO_TREE(mt_TimingUploadItem, mt_TimingUpload.enabled);// 添加mt_RunLadder成员QTreeWidgetItem* mt_RunLadderItem = new QTreeWidgetItem(root);mt_RunLadderItem->setText(0, "mt_RunLadder");ADD_MEMBER_TO_TREE(mt_RunLadderItem, mt_RunLadder.stepCount);ADD_MEMBER_TO_TREE(mt_RunLadderItem, mt_RunLadder.stepValue);// 添加其他成员ADD_MEMBER_TO_TREE(root, m_None);ADD_MEMBER_TO_TREE(root, m_Crc16);
}#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QTreeWidget>class DeviceParamWidget : public QWidget {
public:DeviceParamWidget(const DeviceParam_Type& deviceParam) {// 创建树QTreeWidget* tree = new QTreeWidget(this);tree->setColumnCount(2);tree->setHeaderLabels({"Name", "Value"});// 遍历设备参数并添加到树中traverseDeviceParamToTree(tree, deviceParam);// 设置布局QVBoxLayout* layout = new QVBoxLayout(this);layout->addWidget(tree);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);DeviceParam_Type deviceParam = {{1, 2.0f},{"192.168.1.1", 8080},{60, true},{10, 0.5f},0,0xFFFF};DeviceParamWidget widget(deviceParam);widget.resize(400, 300);widget.show();return app.exec();
}
http://www.lryc.cn/news/500846.html

相关文章:

  • NLP-中文分词
  • 详解LeetCode地下城游戏(动态规划)——区分两种状态表示形式
  • .NET正则表达式
  • k8s 为什么需要Pod?
  • CV(3)--噪声滤波和特征
  • LDR6500:音频双C支持,数字与模拟的完美结合
  • python web app开发
  • redis数据结构和内部编码及单线程架构
  • 【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)
  • AI大模型学习笔记|人工智能的发展历程、智能体的发展、机器学习与深度学习的基本理论
  • C#实现一个HttpClient集成通义千问-多轮对话功能实现
  • Java Web 7 请求响应(Postman)
  • Android APP自学笔记
  • Linux 系统报打开的文件过多
  • javaWeb之过滤器(Filter)
  • ModStartBlog v10.0.0 发布时间自定义,多图快速粘贴,博客编辑器升级
  • Unexpected token ‘<‘, “<!doctype “... is not valid JSON
  • 24/12/9 算法笔记<强化学习> PPO,DPPO
  • Linux下编译安装METIS
  • 【数据库】关系代数和SQL语句
  • amazon亚马逊滑动识别验证码
  • Android Studio 创建虚拟设备的详细图文操作教程
  • 网络安全法-附则
  • CSS核心(上)
  • 深度学习常用损失函数介绍
  • HarmonyOS-中级(四)
  • React v19稳定版发布12.5
  • 【毕业设计选题】深度学习类毕业设计选题参考 开题指导
  • NanoLog起步笔记-4-Server端的两个线程
  • linux zookeeper安装并服务化