Qt第六章:渲染树-增强版

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

目录

一、工具类(直接COPY)

二、使用


一、工具类(直接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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

文子阳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值