如何更改 PyQtGraph ImageView 中的鼠标滚轮行为?
How can I change mousewheel behaviour in PyQtGraph ImageView?
我正在使用 ImageView 来显示 3D 体积的 2D 切片(MRI 扫描数据),并希望更改鼠标绑定以对用户更直观。默认情况下,鼠标滚轮会更改图像 scale/zoom。相反,我希望滚轮变为 next/previous 切片 - 沿着构成 3D 体积的一系列 2D 图像向前或向后移动。该文档使用 z 轴作为时间 - 因此它会及时向前/向后移动。
我没有看到任何简单的 pyqtgraph 鼠标事件方法可以重新实现,也没有看到如何在 PySide2 中执行此操作。这个虚函数好像有提示grabMouseEvent()但是不知道怎么重新实现才能抓到轮子
这是我创建 window 和 50 帧 100x100 像素噪声数据的最小工作代码:
from PySide2.QtWidgets import QApplication
from PySide2.QtWidgets import QMainWindow
from PySide2.QtWidgets import QWidget
from PySide2.QtWidgets import QHBoxLayout
import pyqtgraph as pg
import numpy as np
import sys
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.cw = QWidget(self)
self.cw.setAutoFillBackground(True)
self.setCentralWidget(self.cw)
self.layout = QHBoxLayout()
self.cw.setLayout(self.layout)
self.DcmImgWidget = MyImageWidget(parent=self)
self.layout.addWidget(self.DcmImgWidget)
self.show()
class MyImageWidget(pg.ImageView):
def __init__(self, parent):
super().__init__()
self._parent = parent
self.ui.histogram.hide()
self.ui.roiBtn.hide()
self.ui.menuBtn.hide()
# 50 frames of 100x100 random noise
img = np.random.normal(size=(50, 100, 100))
self.setImage(img)
def main():
app = QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
它使用图像下方的滚动条滚动得非常好。
如何在 PyQtGraph 对象中重新实现鼠标滚轮事件?
一种可能的解决方法是通过事件过滤器拦截GraphicsView的滚轮事件,阻止事件的传递,然后利用事件信息发出信号,指示是进入下一页还是上一页一.
import sys
from PySide2.QtCore import QObject, QEvent, Signal
from PySide2.QtWidgets import (
QApplication,
QHBoxLayout,
QMainWindow,
QWidget,
)
import pyqtgraph as pg
import numpy as np
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.DcmImgWidget = MyImageWidget()
self.cw = QWidget()
self.cw.setAutoFillBackground(True)
self.setCentralWidget(self.cw)
layout = QHBoxLayout(self.cw)
layout.addWidget(self.DcmImgWidget)
class Helper(QObject):
changed = Signal(bool)
def __init__(self, widget):
super().__init__(widget)
self._widget = widget
self.widget.installEventFilter(self)
@property
def widget(self):
return self._widget
def eventFilter(self, obj, event):
if obj is self.widget and event.type() == QEvent.Wheel:
self.changed.emit(event.angleDelta().y() > 0)
return True
return super().eventFilter(obj, event)
class MyImageWidget(pg.ImageView):
def __init__(self, parent=None):
super().__init__(parent)
self.ui.histogram.hide()
self.ui.roiBtn.hide()
self.ui.menuBtn.hide()
# 50 frames of 100x100 random noise
img = np.random.normal(size=(50, 100, 100))
self.setImage(img)
gv = self.ui.graphicsView
helper = Helper(gv.viewport())
helper.changed.connect(self.change_page)
def change_page(self, state):
self.jumpFrames(1 if state else -1)
def main():
app = QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
我正在使用 ImageView 来显示 3D 体积的 2D 切片(MRI 扫描数据),并希望更改鼠标绑定以对用户更直观。默认情况下,鼠标滚轮会更改图像 scale/zoom。相反,我希望滚轮变为 next/previous 切片 - 沿着构成 3D 体积的一系列 2D 图像向前或向后移动。该文档使用 z 轴作为时间 - 因此它会及时向前/向后移动。
我没有看到任何简单的 pyqtgraph 鼠标事件方法可以重新实现,也没有看到如何在 PySide2 中执行此操作。这个虚函数好像有提示grabMouseEvent()但是不知道怎么重新实现才能抓到轮子
这是我创建 window 和 50 帧 100x100 像素噪声数据的最小工作代码:
from PySide2.QtWidgets import QApplication
from PySide2.QtWidgets import QMainWindow
from PySide2.QtWidgets import QWidget
from PySide2.QtWidgets import QHBoxLayout
import pyqtgraph as pg
import numpy as np
import sys
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.cw = QWidget(self)
self.cw.setAutoFillBackground(True)
self.setCentralWidget(self.cw)
self.layout = QHBoxLayout()
self.cw.setLayout(self.layout)
self.DcmImgWidget = MyImageWidget(parent=self)
self.layout.addWidget(self.DcmImgWidget)
self.show()
class MyImageWidget(pg.ImageView):
def __init__(self, parent):
super().__init__()
self._parent = parent
self.ui.histogram.hide()
self.ui.roiBtn.hide()
self.ui.menuBtn.hide()
# 50 frames of 100x100 random noise
img = np.random.normal(size=(50, 100, 100))
self.setImage(img)
def main():
app = QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
它使用图像下方的滚动条滚动得非常好。
如何在 PyQtGraph 对象中重新实现鼠标滚轮事件?
一种可能的解决方法是通过事件过滤器拦截GraphicsView的滚轮事件,阻止事件的传递,然后利用事件信息发出信号,指示是进入下一页还是上一页一.
import sys
from PySide2.QtCore import QObject, QEvent, Signal
from PySide2.QtWidgets import (
QApplication,
QHBoxLayout,
QMainWindow,
QWidget,
)
import pyqtgraph as pg
import numpy as np
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.DcmImgWidget = MyImageWidget()
self.cw = QWidget()
self.cw.setAutoFillBackground(True)
self.setCentralWidget(self.cw)
layout = QHBoxLayout(self.cw)
layout.addWidget(self.DcmImgWidget)
class Helper(QObject):
changed = Signal(bool)
def __init__(self, widget):
super().__init__(widget)
self._widget = widget
self.widget.installEventFilter(self)
@property
def widget(self):
return self._widget
def eventFilter(self, obj, event):
if obj is self.widget and event.type() == QEvent.Wheel:
self.changed.emit(event.angleDelta().y() > 0)
return True
return super().eventFilter(obj, event)
class MyImageWidget(pg.ImageView):
def __init__(self, parent=None):
super().__init__(parent)
self.ui.histogram.hide()
self.ui.roiBtn.hide()
self.ui.menuBtn.hide()
# 50 frames of 100x100 random noise
img = np.random.normal(size=(50, 100, 100))
self.setImage(img)
gv = self.ui.graphicsView
helper = Helper(gv.viewport())
helper.changed.connect(self.change_page)
def change_page(self, state):
self.jumpFrames(1 if state else -1)
def main():
app = QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()