Qt中QTreeWidget分组展示JSON数据:去重父节点关联子节点
在QTreeWidget中实现按sort_decs分组创建父子节点的通用逻辑
1. 先对JSON数据按sort_decs字段分组
核心是先把原始数据按sort_decs的值做分组,自动实现去重,确保同一个sort_decs值只对应一组子节点集合,后续不管新增什么sort_decs值都能适配。
PyQt 代码示例
import json from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem # 修正原JSON语法错误(去掉对象末尾多余逗号)后的原始数据 raw_data = [ {"id": 7, "sort_decs": "Identity", "last_name": "Lawson"}, {"id": 8, "sort_decs": "Identity", "last_name": "Ferguson"}, {"id": 9, "sort_decs": "Identity", "last_name": "Funke"}, {"id": 10, "sort_decs": "Identity", "last_name": "Fields"}, {"id": 11, "sort_decs": "Identity", "last_name": "Edwards"} ] # 按sort_decs自动分组去重 grouped_data = {} for item in raw_data: group_key = item["sort_decs"] if group_key not in grouped_data: grouped_data[group_key] = [] grouped_data[group_key].append(item["last_name"])
Qt C++ 代码示例
#include <QJsonDocument> #include <QJsonObject> #include <QJsonArray> #include <QMap> #include <QTreeWidget> #include <QTreeWidgetItem> // 假设已将JSON数据解析为QJsonArray(需先修正原JSON的语法错误) QJsonArray rawData = QJsonDocument::fromJson(jsonByteArray).array(); // 按sort_decs自动分组去重 QMap<QString, QStringList> groupedData; for (const QJsonValue& val : rawData) { QJsonObject obj = val.toObject(); QString groupKey = obj["sort_decs"].toString(); QString lastName = obj["last_name"].toString(); groupedData[groupKey].append(lastName); }
2. 遍历分组数据,构建QTreeWidget节点
基于分组后的结构,逐个创建父节点和对应的子节点,无需手动指定任何sort_decs的具体值。
PyQt 代码示例
def build_tree(tree_widget: QTreeWidget, grouped_data: dict): tree_widget.clear() # 遍历每个分组,创建父节点 for group_name, name_list in grouped_data.items(): parent_item = QTreeWidgetItem(tree_widget) parent_item.setText(0, group_name) # 为当前分组的所有last_name创建子节点 for name in name_list: child_item = QTreeWidgetItem(parent_item) child_item.setText(0, name) # 可选:默认展开所有父节点 tree_widget.expandAll() # 调用示例:传入你的QTreeWidget实例和分组后的数据 # build_tree(your_tree_widget, grouped_data)
Qt C++ 代码示例
void buildTree(QTreeWidget* treeWidget, const QMap<QString, QStringList>& groupedData) { treeWidget->clear(); // 遍历每个分组 for (auto it = groupedData.constBegin(); it != groupedData.constEnd(); ++it) { // 创建父节点 QTreeWidgetItem* parentItem = new QTreeWidgetItem(treeWidget); parentItem->setText(0, it.key()); // 批量创建子节点 for (const QString& name : it.value()) { QTreeWidgetItem* childItem = new QTreeWidgetItem(parentItem); childItem->setText(0, name); } } // 可选:默认展开所有节点 treeWidget->expandAll(); } // 调用示例:传入你的QTreeWidget实例和分组后的数据 // buildTree(ui->treeWidget, groupedData);
关键说明
- 分组逻辑是通用核心:通过字典/QMap自动完成
sort_decs的去重,不管后续新增任何sort_decs值,都能自动生成对应的父节点,完全不需要手动判断特定字符串。 - 可扩展性强:如果需要显示
id等其他字段,只需要在创建子节点时额外设置对应列的文本即可(需先给QTreeWidget设置对应列数)。
内容的提问来源于stack exchange,提问作者stephen
相关产品推荐
相关产品推荐

