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