如何在不包含特殊字符或引号的情况下将此英文标题翻译为中文:如何检测鼠标在QGraphicsView小部件以外按下的事件?

2024-04-27 00:03:46 发布

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

我有一个QGraphicsView小部件,里面有一个qgraphicscene。我希望在QGraphicsView小部件的应用程序窗口外部的任何位置检测mouseButtonPressed事件。你知道吗

我尝试将eventFilter安装到应用程序的中心小部件,如下所示:

self.centralwidget.installEventFilter(self)

我的QGraphicsView小部件是self.view开始时间. 在eventFilter方法中,我有以下内容:

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

在我的应用程序中,当我在QGraphicsView内部单击时,仍然会打印出“在QGraphicsView外部”。我相信这是因为QGraphicsView是centralWidget的孩子,但我不确定。你知道吗

任何实现此功能的替代方法都将受到高度赞赏!你知道吗


Tags: 方法selfeventviewobj应用程序部件事件
2条回答

有几种方法可以实现这一点。一种方法是将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)

相关问题 更多 >