You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:21:29