PySide(PyQt),使用types.MethodType动态定义事件

以PySide(PyQt)的图片项为例,比如一个视窗的场景底图是一个QGraphicsPixmapItem,需要修改它的鼠标滚轮事件,以实现鼠标滚轮缩放显示的功能。为了达到这个目的,可以重新定义一个QGraphicsPixmapItem类,并重写它的wheelEvent()函数:

python 复制代码
class MyGraphicsPixmapItem(QGraphicsPixmapItem):
    def __init__(self, pixmap):
        super().__init__(pixmap)
        
    def wheelEvent(self, event):
        self.setScale(self.scale() * (1.001 ** event.delta()))

然后在代码中实例化这个类就可以了,这没有任何问题。

需求的提出:

首先,场景中只有这一个场景底图,而且我仅仅只需要修改它的鼠标滚轮事件响应这个函数,为了这简单的一个需求重建一个新的类,不是那么优雅。然后,鼠标滚轮缩放显示的这个功能,我还想用到别的目标上,需要复用和方便移植。或者,鼠标滚轮的事件响应,我需要在程序中根据工况不同动态改变。为此,可以采用types.MethodType动态定义事件方法:

python 复制代码
from PySide6.QtCore import Qt
from PySide6.QtGui import QPixmap
from PySide6.QtWidgets import QGraphicsScene, QGraphicsView, QApplication, QGraphicsPixmapItem, QGraphicsItem, \
    QGraphicsRectItem
import types

app = QApplication([])


# 鼠标滚轮缩放的功能(附加检测shift键缩放)
def wheelZoom(graphics_item, event):
    if event.modifiers() & Qt.ShiftModifier:
        graphics_item.setScale(graphics_item.scale() * (1.001 ** event.delta()))

# ############不检测shift键缩放###############
# def wheelZoom(graphics_item, event):
#     graphics_item.setScale(graphics_item.scale() * (1.001 ** event.delta()))
# ##########################################
def hover_enter_event(graphics_item, event):
    print("鼠标进入")
    event.accept()

def hover_leave_event(graphics_item, event):
    print("鼠标离开")
    event.accept()



scene = QGraphicsScene()  # 创建场景对象
view = QGraphicsView(scene)  # 创建视图对象

# 设置场景并显示
view.setScene(scene)
view.show()
pixmap = QPixmap("example.jpg")  # 加载图片
pixmap_item = QGraphicsPixmapItem(pixmap)  # 创建图片对象
scene.addItem(pixmap_item)  # 将图片添加到场景中

rect_item = QGraphicsRectItem(100,100,100,100)  # 创建一个矩形对象
scene.addItem(rect_item)  # 将矩形添加到场景中

pixmap_item.setAcceptHoverEvents(True)  # 设置图片接受鼠标事件
pixmap_item.wheelEvent = types.MethodType(wheelZoom, pixmap_item)  # 给图像项添加滚轮缩放事件
rect_item.wheelEvent = types.MethodType(wheelZoom, rect_item)  # 给图像项添加滚轮缩放事件
pixmap_item.hoverEnterEvent = types.MethodType(hover_enter_event, pixmap_item)  # 给图像项添加鼠标进入事件
pixmap_item.hoverLeaveEvent = types.MethodType(hover_leave_event, pixmap_item)  # 给图像项添加鼠标离开事件

app.exec()
复制代码
上面的代码,定义了几个方法,并且将其动态绑定到了图片项的实例,实现了所需的功能。

types的更多学习笔记见:Python的types库学习记录-CSDN博客

相关推荐
不知名君1 天前
PyQt图表PyQtGraph多图光标同步pglive
pyqt
躺不平的小刘2 天前
从YOLOv5到RKNN:零冲突转换YOLOv5模型至RK3588 NPU全指南
linux·python·嵌入式硬件·yolo·conda·pyqt·pip
Goona_3 天前
PyQt多窗口应用开发:构建完整的可二次开发用户登录注册模板
python·小程序·excel·pyqt
AntBlack8 天前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
前端市界8 天前
前端视角: PyQt6+Vue3 跨界开发实战
前端·qt·pyqt
AI大法师10 天前
Python:PyQt5 全栈开发教程,构建跨平台桌面应用
python·pyqt
宋大水19 天前
【大作业-12】草莓成熟度检测模型,YOLO+PyQt+MySQL
数据库·深度学习·mysql·yolo·目标检测·pyqt·课程设计
mortimer19 天前
Python GUI 应用启动优化实战:从3分钟到“秒开”的深度历程
python·github·pyqt
懷淰メ21 天前
日常--详细介绍qt Designer常用快捷键(详细图文)
开发语言·qt·pyqt·快捷键·qtdesigner·ui设计·qt设计师
钢铁男儿1 个月前
PyQt事件处理机制深度指南:超越信号与槽的底层掌控
pyqt