QScrollArea QScrollArea's viewport (get with QAbstractScrollArea.viewport()) The sliding widget QLabel
SlidingWidgetEventFilter: PySide.QtCore.QEvent.Type.MouseButtonPress SlidingWidgetEventFilter: PySide.QtCore.QEvent.Type.MouseMove [... ditto MouseMove events ...] SlidingWidgetEventFilter: PySide.QtCore.QEvent.Type.MouseButtonRelease
LabelEventFilter: PySide.QtCore.QEvent.Type.MouseButtonPress SlidingWidgetEventFilter: PySide.QtCore.QEvent.Type.MouseButtonPress LabelEventFilter: PySide.QtCore.QEvent.Type.MouseMove SlidingWidgetEventFilter: PySide.QtCore.QEvent.Type.MouseMove [... ditto pairs of MouseMove events ...] LabelEventFilter: PySide.QtCore.QEvent.Type.MouseButtonRelease SlidingWidgetEventFilter: PySide.QtCore.QEvent.Type.MouseButtonRelease
# QT from PySide.QtCore import * from PySide.QtGui import * ### Event filters class MyScrollAreaEventFilter(QObject): def eventFilter(self, i_obj, i_event): ## Touch events: silently suppress if i_event.type() == QEvent.TouchBegin: return True if i_event.type() == QEvent.TouchUpdate: return True if i_event.type() == QEvent.TouchEnd: return True ## Mouse events: log and suppress if i_event.type() == QEvent.MouseButtonPress: print "MyScrollAreaEventFilter: " + str(i_event.type()) return True if i_event.type() == QEvent.MouseMove: print "MyScrollAreaEventFilter: " + str(i_event.type()) return True if i_event.type() == QEvent.MouseButtonRelease: print "MyScrollAreaEventFilter: " + str(i_event.type()) return True ## Any other events: leave alone return False class ViewportEventFilter(QObject): def eventFilter(self, i_obj, i_event): ## Touch events: silently suppress if i_event.type() == QEvent.TouchBegin: return True if i_event.type() == QEvent.TouchUpdate: return True if i_event.type() == QEvent.TouchEnd: return True ## Mouse events: log and suppress if i_event.type() == QEvent.MouseButtonPress: print "ViewportEventFilter: " + str(i_event.type()) return True if i_event.type() == QEvent.MouseMove: print "ViewportEventFilter: " + str(i_event.type()) return True if i_event.type() == QEvent.MouseButtonRelease: print "ViewportEventFilter: " + str(i_event.type()) return True ## Any other events: leave alone return False class SlidingWidgetEventFilter(QObject): def eventFilter(self, i_obj, i_event): ## Touch events: silently suppress if i_event.type() == QEvent.TouchBegin: return True if i_event.type() == QEvent.TouchUpdate: return True if i_event.type() == QEvent.TouchEnd: return True ## Mouse events: log and suppress if i_event.type() == QEvent.MouseButtonPress: print "SlidingWidgetEventFilter: " + str(i_event.type()) return True if i_event.type() == QEvent.MouseMove: print "SlidingWidgetEventFilter: " + str(i_event.type()) return True if i_event.type() == QEvent.MouseButtonRelease: print "SlidingWidgetEventFilter: " + str(i_event.type()) return True ## Any other events: leave alone return False class LabelEventFilter(QObject): def eventFilter(self, i_obj, i_event): ## Touch events: silently suppress if i_event.type() == QEvent.TouchBegin: return True if i_event.type() == QEvent.TouchUpdate: return True if i_event.type() == QEvent.TouchEnd: return True ## Mouse events: log and don't suppress if i_event.type() == QEvent.MouseButtonPress: print "LabelEventFilter: " + str(i_event.type()) return False if i_event.type() == QEvent.MouseMove: print "LabelEventFilter: " + str(i_event.type()) return False if i_event.type() == QEvent.MouseButtonRelease: print "LabelEventFilter: " + str(i_event.type()) return False ## Any other events: leave alone return False ### Main class class MyScrollArea(QScrollArea): def __init__(self): QScrollArea.__init__(self) # Monitor events on the scroll area self.installEventFilter(MyScrollAreaEventFilter(self)) # Monitor events on the scroll area's viewport self.viewport().installEventFilter(ViewportEventFilter(self)) # Set the scroll area's widget (to be known as the 'sliding' widget # from here on) to a plain QWidget, 1000x1000 px slidingWidget = QWidget() slidingWidget.setMinimumSize(1000, 1000) self.setWidget(slidingWidget) # Monitor events on it slidingWidget.installEventFilter(SlidingWidgetEventFilter(self)) # Add a label to the sliding widget label = QLabel("Hello", slidingWidget) label.move(200, 200) # Monitor events on it label.installEventFilter(LabelEventFilter(self)) import sys app = QApplication(sys.argv) scrollArea = MyScrollArea() scrollArea.show() app.exec_() sys.exit()