如何将鼠标事件传播到 QGraphicsItemGroup 中的 QGraphicsItem?

How to propagate mouse events to a QGraphicsItem in a QGraphicsItemGroup?

我想捕捉某些 QGraphicsItem 的鼠标事件。当项目直接添加到 QGraphicsScene 时,一切都按预期工作:当使用下面的选项 1 时,当用户在矩形内单击时,控制台打印 "foo"。

但是,如果项目是通过组间接添加的,则它不再接收事件(下面的选项 2)。事件链似乎就这样被打破了。我试图将 scene 设置为 QGraphicsItem 的父级以恢复链,但它导致错误,显然我没有以正确的方式做?

QGraphicsItem 添加到组并仍然接收鼠标事件的正确方法是什么?

from PyQt5.QtWidgets import QApplication, QGraphicsRectItem, QGraphicsScene, QGraphicsView, QMainWindow


class Rect(QGraphicsRectItem):
  def mousePressEvent(self, event):
    print("foo")


app = QApplication([])
window = QMainWindow()
window.setGeometry(100, 100, 400, 400)
view = QGraphicsView()
scene = QGraphicsScene()

rect = Rect(0, 0, 150, 150)

# Option 1.
# scene.addItem(rect)  # works fine, prints 'foo' when clicked
# Option 2.
group = scene.createItemGroup([rect])  # no mouse event received by rect

view.setScene(scene)
window.setCentralWidget(view)
window.show()
app.exec()

如果使用 QGraphicsItemGroup 的唯一 objective 是启用一组项目的移动,那么过程是 select 项目,将它们添加到组中,移动项目并在执行任何操作之前从组中删除项目。因此,项目没有必要永久属于该组,只有在必要时才需要避免副作用,例如不传输事件。