Как избежать того, чтобы события мыши были съедены QGraphicsView - PullRequest
0 голосов
/ 21 января 2019

Я хочу, чтобы события мыши достигли соответствующего 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 голосов
/ 21 января 2019

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)
...