# 参考网上的一篇文章, 自已写的例子.
# 解决 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()
# 有可能会漏了一部分事件的
QGraphicsItemGroup event处理
最新推荐文章于 2024-03-05 21:02:04 发布