QGraphicsItemGroup event处理

# 参考网上的一篇文章, 自已写的例子.
# 解决 QGraphicsItemGroup 不能向他的子 item 传递事件的问题,
# 要改的,并不是 group层的代码,而是他子类的函数:sceneEvent
# setfilterschildevents 并不是这个问题的关键,sethandleschildevents 已经 obsolete , 所以都没用.
# 本例中 有一个 proxy widget的按钮, 在此模式下,可以正常工作.

# 有三种方式可以重载 sceneEvent,
# 1. 派生一个子类, 这里就不做测试了.
# 2. 把原类的函数更改掉. 因为 pyqt 是 qt的python 包装, 并不是 built-in , 所以这种方法,可以实行.
# 3. 更改子类的方法.

# 要注意的是, 方法 2 和方法 3 在实行时, 函数的写法不同. 方法3, 实际上,就是 一个装饰器.
# 方法2 在更改时, 对原代码的影响最小, 但可能是给自己挖坑..
# 方法3 要对每一个实例进行更改, 实际上, 操作可能有些困难, 别的一些写好的函数内部调用时,可能无法实行.
# 具体 选哪种方式, 见仁见智吧.


# python 3.8 , pyqt 5.15

from typing import Callable
from PyQt5 import QtWidgets as qw, QtCore as qc, QtGui as qg
import sys
import numpy as np


# 通过改变类的函数,来重载 event
def change_type_event():
    def mouseReleaseEvent(
        self: qw.QGraphicsItem, event: "qw.QGraphicsSceneMouseEvent"
    ) -> None:
        print("mouseReleaseEvent", type(self))
        if not isinstance(self, qw.QGraphicsProxyWidget):
            self.setPen(self._base_pen)
        return self._mouseReleaseEvent(self, event)

    def mousePressEvent(
        self: qw.QGraphicsItem, event: "qw.QGraphicsSceneMouseEvent"
    ) -> None:
        event.accept()
        print("mousePressEvent", type(self))
        if not isinstance(self, qw.QGraphicsProxyWidget):
            self._base_pen = self.pen()
            p = qg.QPen()
            p.setColor(qg.QColor(255, 0, 0))
            p.setWidth(self.pen().width())
            self.setPen(p)
        return self._mousePressEvent(self, event)

    def sceneEvent(self: qw.QGraphicsItem, event: qc.QEvent):
        event.accept()
        # 有可能会漏了一部分事件的
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值