Как обнаружить событие mouseButtonPressed вне виджета QGraphicsView? - PullRequest
0 голосов
/ 02 декабря 2019

У меня есть виджет QGraphicsView с установленным QGraphicsScene. Я хочу обнаружить событие mouseButtonPressed в любом месте окна моего приложения за пределами виджета QGraphicsView.

Я попытался установить eventFilter в центральный виджет приложения следующим образом:

self.centralwidget.installEventFilter(self)

Мой виджет QGraphicsView - self.viewStartImg. В моем методе eventFilter у меня есть следующее:

def eventFilter(self, obj, event):
    if obj != self.viewStartImg and event.type() == QEvent.MouseButtonPress:
            print('Outside the QGraphicsView')

В моем приложении, когда я щелкаю внутри QGraphicsView, я все равно получаю распечатку «За пределами QGraphicsView». Я считаю, что это происходит потому, что QGraphicsView является дочерним элементом centralWidget, но я не уверен.

Любой альтернативный метод достижения этой функциональности высоко ценится!

1 Ответ

1 голос
/ 02 декабря 2019

Есть несколько способов добиться этого. Одним из способов будет подкласс QGraphicsView и переопределение mousePressEvent в подклассе. Другая возможность - установить фильтр событий на объекте просмотра. Для первого метода вы должны сделать что-то вроде этого

from PyQt5 import QtWidgets, QtCore

class MyView(QtWidgets.QGraphicsView):
    def mousePressEvent(self, event):
        print('mouse pressed inside view')
        event.accept()

class MyWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.central = QtWidgets.QWidget(self)
        self.view = MyView(self.central)
        self.scene = QtWidgets.QGraphicsScene()
        self.view.setScene(self.scene)

        hlayout = QtWidgets.QHBoxLayout(self.central)
        hlayout.setContentsMargins(50,50,50,50)
        hlayout.addWidget(self.view)

        self.setCentralWidget(self.central)

    def mousePressEvent(self, event):
        print('mouse pressed ouside view')
        event.accept()

if __name__ == "__main__" :
    app = QtWidgets.QApplication([])
    win = MyWindow()
    win.show()
    app.exec()

А для второго

class MyWindow(QtWidgets.QMainWindow):
    money_changed = QtCore.pyqtSignal(int)

    def __init__(self):
        super().__init__()

        self.central = QtWidgets.QWidget(self)
        self.view = QtWidgets.QGraphicsView(self.central)
        self.scene = QtWidgets.QGraphicsScene()
        self.view.setScene(self.scene)

        hlayout = QtWidgets.QHBoxLayout(self.central)
        hlayout.setContentsMargins(50,50,50,50)
        hlayout.addWidget(self.view)

        self.setCentralWidget(self.central)

        self.view.installEventFilter(self)

    def mousePressEvent(self, event):
        print('mouse pressed ouside view')
        event.accept()

    def eventFilter(self, object, event):
        if object == self.view and event.type() == QtCore.QEvent.MouseButtonPress:
            print('mouse pressed inside view')
            return True
        return super().eventFilter(object, event)
...