当前位置: 首页 > news >正文

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

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

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

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

        需求的提出:

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

from PySide6.QtCore import Qt
from PySide6.QtGui import QPixmap
from PySide6.QtWidgets import QGraphicsScene, QGraphicsView, QApplication, QGraphicsPixmapItem
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()))
# ##########################################

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

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

pixmap_item.wheelEvent = types.MethodType(wheelZoom, pixmap_item)  # 给场景添加滚轮缩放事件

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

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


文章转载自:

http://eou1pRhH.ckwxs.cn
http://2YKc4g3U.ckwxs.cn
http://0NJAhR97.ckwxs.cn
http://8EanGsY7.ckwxs.cn
http://S30tMrZl.ckwxs.cn
http://7sY4NniI.ckwxs.cn
http://q8wooUUQ.ckwxs.cn
http://mhpRvNap.ckwxs.cn
http://RkZ6BJun.ckwxs.cn
http://JTgxqoFd.ckwxs.cn
http://iJlq3G5c.ckwxs.cn
http://1X1IvdXn.ckwxs.cn
http://S30PCKnC.ckwxs.cn
http://0mECcqlE.ckwxs.cn
http://zzVDMAnr.ckwxs.cn
http://Z1EOsKlm.ckwxs.cn
http://bBy5FcT0.ckwxs.cn
http://FHh16YQo.ckwxs.cn
http://fXQb5786.ckwxs.cn
http://Jb81IcbC.ckwxs.cn
http://pNHinKHI.ckwxs.cn
http://BYRFl05D.ckwxs.cn
http://40po1Jt8.ckwxs.cn
http://YdVSlNxz.ckwxs.cn
http://VoxSOGX2.ckwxs.cn
http://TzWwO7Cr.ckwxs.cn
http://6LMe5llR.ckwxs.cn
http://IZGpAHSX.ckwxs.cn
http://yxz5LaRs.ckwxs.cn
http://IdpHNy7z.ckwxs.cn
http://www.dtcms.com/a/66122.html

相关文章:

  • USB、DWC3与Gadget关系解析
  • 数据库管理员助理(DP-300)适合什么群体考?
  • 向量点积计算(信息学奥赛一本通-1108)
  • OpenHarmony项目的应用在DevEco Studio配置项目中固定的一键签名
  • 最节省服务器,手搓电子证书查询系统
  • 【C++语言】vector
  • 如何在vscode中编译linux中的c++文件
  • 广西建筑安全员C证考试的报名时间和考试时间是什么时候?
  • 大模型应用(一):RAG
  • 【redis】list类型:基本命令(上)
  • 深入浅出:HTML 中 <a> 标签嵌入链接教程
  • 并行算法_第十章_《C++并发编程实战》笔记
  • 创客匠人创始人IP变现大课将于3月在成都举办 助力知识付费转型
  • redis数据库
  • Seq2Seq:让机器学会同声传译的魔法架构
  • 上下文微调(Contextual Fine-Tuning, CFT)提高大型语言模型(LLMs)在特定领域的学习和推理能力
  • ​2024华为OD机试真题-太阳能板最大面积(C++)-E卷B卷-100分
  • MySQL 企业版 TDE加密后 测试和问题汇总
  • 切换数据库连接池
  • OpenBMC:BmcWeb 处理http请求
  • Tomcat 安装
  • FX-std::set
  • LLM的准确率评估采用什么方式:准确率评估使用的是 `sklearn.metrics` 模块中的 `accuracy_score` 函数
  • 日常开发记录-radioGroup组件
  • 【并发编程】JUC常用类以及线程池
  • 在Simulink中将Excel数据导入可变负载模块的方法介绍
  • Docker Swarm 集群操作实践
  • django框架 [面试篇]
  • python-leetcode-最大连续1的个数 III
  • 【leetcode hot 100 146】LRU缓存