如何避免QGraphicsView吞噬鼠标事件

时间:2019-01-21 00:11:39

标签: python pyqt pyqt5 qgraphicsview

我希望鼠标事件能够到达适当的QGraphicsItem,但它们不会超过QGraphicsView。

我将代码减少到41行,注释掉了事件处理程序,但无济于事。如果有处理程序,则由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_()

1 个答案:

答案 0 :(得分:1)

mouseReleaseEvent仅在接受mousePressEvent处理的事件时被调用,因此使用以下代码,事件将到达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)