目录
一、工具类(直接COPY)
# render_tree_widget_util.py
from PySide6.QtCore import Qt, QPoint
from PySide6.QtGui import QAction, QIcon
from PySide6.QtWidgets import QTreeWidget, QTreeWidgetItem, QWidget, QMenu
class TreeWidgetDataDTO:
def __init__(self, id: any, parent_id: any, name: str):
"""
菜单数据接口
:param id: ID
:param parent_id: 父ID
:param name: 菜单名称
"""
self.id: any = id
self.parent_id: any = parent_id
self.name: str = name
# 实例化
self.treeWidgetItem = QTreeWidgetItem([self.name])
# 存储相关数据
self.treeWidgetItem.setData(0, Qt.UserRole + 1, self)
def render_treeWidget(treeWidget: QTreeWidget,
data: list[TreeWidgetDataDTO],
itemClick=None,
itemDoubleClick=None) -> QTreeWidget:
"""
渲染树
:param treeWidget: 树控件
:param data: 待渲染数据
:param itemClick: 单击事件
:param itemDoubleClick: 双击事件
:return:
"""
treeWidget.setColumnCount(1)
treeWidget.setHeaderHidden(True)
# 打开右键菜单的策略
treeWidget.setContextMenuPolicy(Qt.CustomContextMenu)
# 绑定右键菜单函数
treeWidget.customContextMenuRequested.connect(lambda point: __handle_contextMenuEvent__(treeWidget, point))
if itemClick:
treeWidget.itemClicked.connect(itemClick)
if itemDoubleClick:
treeWidget.itemDoubleClicked.connect(itemDoubleClick)
# 转为字典
mapping: dict[any, TreeWidgetDataDTO] = dict(zip([i.id for i in data], data))
# 树容器
treeWidgetItems: list[QTreeWidgetItem] = []
for d in data:
# 如果找不到父级项,则是根节点
parent: TreeWidgetDataDTO = mapping.get(d.parent_id)
if parent is None:
treeWidgetItems.append(d.treeWidgetItem)
else:
parent.treeWidgetItem.addChild(d.treeWidgetItem)
# 挂载到树上
treeWidget.insertTopLevelItems(0, treeWidgetItems)
return treeWidget
def __handle_contextMenuEvent__(widget: QWidget, point: QPoint) -> None:
"""
自定义右键菜单
:param widget: 载体
:param point: 相对载体坐标
:return:
"""
# 1.创建菜单对象
menu = QMenu()
# 2.创建菜单列表
menu1 = QAction(QIcon("./1.png"), "保存")
menu2 = QAction("退出")
# 3.将菜单列表添加到菜单对象
menu.addAction(menu1)
# 4.添加分隔线
menu.addSeparator()
menu.addAction(menu2)
# 5.给菜单添加事件
menu1.triggered.connect(lambda: (print("保存"), menu.close()))
menu2.triggered.connect(lambda: quit())
# 6.显示菜单 event.globalPos()获取全局鼠标点击位置
menu.exec(widget.mapToGlobal(point))
二、使用
from PySide6.QtCore import Qt
from PySide6.QtUiTools import QUiLoader
from utils.render_tree_widget_util import TreeWidgetDataDTO, render_treeWidget
# 模拟菜单
mock_menu = [
TreeWidgetDataDTO(1, None, '菜单1'), TreeWidgetDataDTO(2, None, '菜单2'),
TreeWidgetDataDTO(3, 1, '子菜单1'), TreeWidgetDataDTO(4, 2, '子菜单2'),
TreeWidgetDataDTO(5, 4, '子菜单2'), TreeWidgetDataDTO(6, 4, '子菜单2'),
]
class HomeView:
def __init__(self):
# 加载UI文件
self.ui = QUiLoader().load('home.ui')
render_treeWidget(
self.ui.treeWidget,
data=mock_menu,
itemClick=lambda item: print('单击事件', item.data(0, Qt.UserRole + 1)),
itemDoubleClick=lambda item: print('双击事件', item.data(0, Qt.UserRole + 1))
)
from PySide6.QtWidgets import QApplication
from web.home import HomeView
if __name__ == '__main__':
app = QApplication([])
home_view = HomeView()
home_view.ui.show()
app.exec()

该代码实现了一个用PySide6库构建的QTreeWidget,包括数据结构TreeWidgetDataDTO,用于渲染树形结构数据,支持单击和双击事件处理,以及自定义右键菜单功能。示例中展示了如何使用这个工具类来渲染菜单数据并处理用户交互。

1万+

被折叠的 条评论
为什么被折叠?



