我有一个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的子级,但是我不确定。
高度赞赏实现此功能的任何替代方法!
有几种方法可以实现这一目标。一种方法是子类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)