当前位置: 首页 > 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.mrgr.cn/news/79606.html

相关文章:

  • 我们来学mysql -- 事务并发之不可重复读(原理篇)
  • Text2SQL(NL2sql)对话数据库:设计、实现细节与挑战
  • 【论文阅读】相似误差订正方法在风电短期风速预报中的应用研究
  • NanoLog起步笔记-7-log解压过程初探
  • 【开源】A063—基于Spring Boot的农产品直卖平台的设计与实现
  • Vue3小兔鲜电商项目
  • 【人工智能基础08】卷积神经网络习题:卷积神经网络计算、图像填充、卷积的表达与设计
  • 【优选算法 位运算】位运算算法入门详解:位运算小专题
  • 分布式架构
  • 使用mmdeploy框架C++预测mask并绘制最小外接矩形
  • 排序算法(1):冒泡排序
  • STM32F103 FPGA进行通信方式
  • 第四十六篇 Vision Transformer论文翻译
  • 【开源】A065—基于SpringBoot的库存管理系统的设计与实现
  • java中的抽象类
  • Redis安装和Python练习(Windows11 + Python3.X + Pycharm社区版)
  • 人工智能大模型LLM开源资源汇总(持续更新)
  • 【光电倍增管】-打拿极 PMT
  • SpringBoot3整合Druid数据源
  • 配置新电脑设置的脚本