"""Qt presentation port: wheel pans X; Ctrl+wheel pans Y, never zooms.""" from PySide6.QtCore import Qt, Signal from PySide6.QtWidgets import QScrollArea class PlotScrollArea(QScrollArea): user_scrolled = Signal(str) def __init__(self, parent=None): super().__init__(parent) self._remainder = {'x': 0., 'y': 0.} def wheelEvent(self, event): axis = 'y' if event.modifiers() & Qt.KeyboardModifier.ControlModifier else 'x' bar = self.verticalScrollBar() if axis == 'y' else self.horizontalScrollBar() pixels, angle = event.pixelDelta(), event.angleDelta() if not pixels.isNull(): delta = pixels.y() if pixels.y() else pixels.x() else: delta = (angle.y() if angle.y() else angle.x()) / 120. * 60. self._remainder[axis] -= delta movement = int(self._remainder[axis]) self._remainder[axis] -= movement if delta: self.user_scrolled.emit(axis) bar.setValue(bar.value()+movement) event.accept()