如何避免鼠标事件被QGraphicsView吃掉



我希望鼠标事件到达适当的QGraphicsItem,但它们不会比QGraphicsView更进一步。

我已经将代码减少到 41 行,注释掉了事件处理程序,但无济于事。 如果QGraphicsView有处理程序,则由QGraphicsView处理,如果没有,则根本不捕获。

我确定我错过了一些明显的东西,但我看不到它。

from PyQt5.QtWidgets import *
class MyFrame(QGraphicsView):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setScene(QGraphicsScene())
        self.scene().addItem(Group())
    def mouseReleaseEvent(self, event):
        print('in QGraphicsView')
        return QGraphicsView.mouseReleaseEvent(self, event)
class Group(QGraphicsItemGroup):
    def __init__(self, parent=None):
        super().__init__()
        item = MyEllipse(0, 0, 20, 20)
        self.addToGroup(item)
    def mouseReleaseEvent(self, event):
        print('in QGraphicsItemGroup')
        return QGraphicsItemGroup.mouseReleaseEvent(self, event)
class MyEllipse(QGraphicsEllipseItem):
    def mouseReleaseEvent(self, event):
        print('in QGraphicsEllipseItem')
        return QGraphicsEllipseItem.mouseReleaseEvent(self, event)
if __name__ == '__main__':
    app = QApplication([])
    f = MyFrame()
    f.show()
    app.exec_()

且仅当接受mousePressEvent处理的事件时,才会调用mouseReleaseEvent,因此使用以下代码,事件将到达QGraphicsItemGroup

class Group(QGraphicsItemGroup):
    def __init__(self, parent=None):
        super().__init__()
        item = MyEllipse(0, 0, 20, 20)
        self.addToGroup(item)
    def mousePressEvent(self, event):
        QGraphicsItemGroup.mousePressEvent(self, event)
        event.accept()
    def mouseReleaseEvent(self, event):
        print('in QGraphicsItemGroup')
        QGraphicsItemGroup.mouseReleaseEvent(self, event)

但正如@ekhumoro指出的那样,QGraphicsItemGroup充当单个元素,因此事件不会传输到它们处理的项目。

如果要检测何时按下项目,可以使用以下方法:

class Group(QGraphicsItemGroup):
    def __init__(self, parent=None):
        super().__init__()
        self._item = MyEllipse(0, 0, 20, 20)
        self.addToGroup(self._item)
    def mousePressEvent(self, event):
        QGraphicsItemGroup.mousePressEvent(self, event)
        event.accept()
    def mouseReleaseEvent(self, event):
        print('in QGraphicsItemGroup')
        if self._item.mapToParent(self._item.boundingRect()).containsPoint(event.pos(), Qt.OddEvenFill):
            print("_item")
        QGraphicsItemGroup.mouseReleaseEvent(self, event)

相关内容

  • 没有找到相关文章

最新更新