如何避免QGraphicsView吃掉鼠标事件

问题描述 投票:1回答:1

我希望鼠标事件能够到达适当的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_()
python pyqt pyqt5 qgraphicsview
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.