0
点赞
收藏
分享

微信扫一扫

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()

举报

相关推荐

第六章,树 学习笔记

PTA第六章

第六章 BOM

第六章 容器

第六章:接口

第六章总结

第六章 初识MyBatis

0 条评论