Qt第六章:渲染树

渲染树组件: 

import sys
from PySide6.QtWidgets import QApplication, QTreeWidget, QTreeWidgetItem

# 数据
data = {"Project A": ["file_a.py", "file_a.txt", "something.xls"],
        "Project B": ["file_b.csv", "photo.jpg"],
        "Project C": []}

if __name__ == '__main__':
    app = QApplication()

    # 创建树组件
    tree = QTreeWidget()
    # 设置列数
    tree.setColumnCount(2)
    # 设置列头
    tree.setHeaderLabels(["Name", "Type"])

    items = []
    for key, values in data.items():
        item = QTreeWidgetItem([key])
        for value in values:
            ext = value.split(".")[-1].upper()
            child = QTreeWidgetItem([value, ext])
            item.addChild(child)
        items.append(item)

    # 挂载到树上
    tree.insertTopLevelItems(0, items)
    tree.show()
    
    sys.exit(app.exec())

封装函数:

from PySide6.QtWidgets import QApplication
from PySide6.QtWidgets import QWidget, QTreeWidget, QTreeWidgetItem

"""
data: 数据列表
tree: 树组件句柄
column: [(字段,显示名称),...]
id_point: 数据主键(默认id)
parent_pointer: 标注父子关系的字段(默认parent_id)
"""


def list2QTree(data, tree: QTreeWidget, column: list, id_point='id', parent_pointer='parent_id') -> QTreeWidget:
    # 设置列数
    tree.setColumnCount(len(column))

    # 标题
    tree.setHeaderLabels([i[1] for i in column])

    # 顶层节点
    items = []

    # 转成QTreeWidgetItem列表
    data_item = [{id_point: i[id_point], parent_pointer: i[parent_pointer],
                  'item': QTreeWidgetItem([str(i[j[0]]) for j in column])} for i in data]

    # 转成ID为Key的字典
    mapping: dict = dict(zip([i[id_point] for i in data_item], data_item))

    # 组树
    for d in data_item:
        parent: dict = mapping.get(d[parent_pointer])
        if parent is None:
            items.append(d['item'])
        else:
            item: QTreeWidgetItem = parent.get('item')
            item.addChild(d.get('item'))

    # 挂载到树上
    tree.insertTopLevelItems(0, items)
    return tree

使用示例:

class Form(QWidget):
    def __init__(self, parent=None):
        data: list = [
            {'id': 1, 'parent_id': 0, 'name': '用户管理', 'url': ''},
            {'id': 2, 'parent_id': 0, 'name': '菜单管理', 'url': ''},
            {'id': 3, 'parent_id': 1, 'name': '新增用户', 'url': 'https://www.baidu.com'},
            {'id': 4, 'parent_id': 1, 'name': '删除用户', 'url': 'https://www.baidu.com'},
            {'id': 5, 'parent_id': 2, 'name': '新增菜单', 'url': 'https://www.baidu.com'},
            {'id': 6, 'parent_id': 2, 'name': '删除菜单', 'url': ''},
            {'id': 7, 'parent_id': 6, 'name': '单个删除', 'url': 'https://www.baidu.com'},
            {'id': 8, 'parent_id': 6, 'name': '批量删除', 'url': 'https://www.baidu.com'},
        ]

        super(Form, self).__init__(parent=parent)
        self.setWindowTitle("首次")
        self.resize(320, 180)
        tree = QTreeWidget(self)
        list2QTree(data=data, tree=tree, column=[('name', '姓名'), ('url', '地址')])


if __name__ == '__main__':
    app = QApplication([])
    form = Form()
    form.show()
    app.exec()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文子阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值