31 lines
1.3 KiB
Python
31 lines
1.3 KiB
Python
# Qt-прокрутка области графика анализатора: колесо перемещает X, Ctrl с колесом — Y.
|
||
# Обработчик меняет область просмотра, сохраняя масштаб и исходный массив захвата.
|
||
|
||
"""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()
|