渲染树组件:
- 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()