如何在QGraphicsView小部件外部检测mouseButtonPressed事件?

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

我有一个QGraphicsView小部件,其中设置了QGraphicsScene。我希望在QGraphicsView小部件的应用程序窗口outside中的任何位置检测到mouseButtonPressed事件。

我尝试如下将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的内部时,仍然会打印出'Out of the QGraphicsView'。我相信这是因为QGraphicsView是centralWidget的子级,但是我不确定。

高度赞赏实现此功能的任何替代方法!

python pyqt pyqt5 qgraphicsview
1个回答
0
投票

有几种方法可以实现这一目标。一种方法是子类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)
© www.soinside.com 2019 - 2024. All rights reserved.