I am trying to capture MouseButtonRelease
after installing an eventFilter. The correctly captures the MouseButtonPress
but not MouseButtonRelease
.
Am I missing something or is this not possible ?
Minimum working example :
import sys
from PySide6.QtWidgets import QGraphicsScene, QGraphicsView, QApplication
from PySide6.QtCore import QObject, QEvent
class FilterFunction(QObject):
def __init__(self, parent: QObject) -> None:
super().__init__(parent)
def eventFilter(self, watched: QObject, event: QEvent) -> bool:
if event.type() == QEvent.MouseButtonRelease:
print(" QEvent.MouseButtonRelease")
elif event.type() == QEvent.MouseButtonPress:
print(" QEvent.MouseButtonPress")
return super().eventFilter(watched, event)
app = QApplication(sys.argv)
scene = QGraphicsScene(0, 0, 400, 200)
view = QGraphicsView(scene)
view.setMouseTracking(True)
filterFunciton = FilterFunction(view)
view.installEventFilter(filterFunciton)
view.show()
app.exec()
To get the correct events for a view, you must monitor its viewport:
view.viewport().installEventFilter(filterFunciton)
The viewport is the area that renders the contents of the view, so events must be routed relative to that in order to ensure e.g. the correct co-ordinates are delivered. The view itself may include other components, such as a frame, scrollbars, headers etc, which aren't considered part of the contents, and therefore must be handled separately. Also, the viewport widget itself can be set independently of the view.