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

2024-10-01 02:32:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想让鼠标事件到达适当的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_()

Tags: inselfevent处理程序returninitdef事件
1条回答
网友
1楼 · 发布于 2024-10-01 02:32:27

当且仅当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)

相关问题 更多 >