Python 如何在PyQtGraph ImageView中更改鼠标滚轮行为?
我正在使用ImageView显示3D体积的2D切片(MRI扫描数据),并希望更改鼠标绑定以使用户更直观。默认情况下,鼠标滚轮会更改图像比例/缩放。相反,我希望控制盘切换到下一个/上一个切片——沿组成3D体积的一系列2D图像向前或向后移动。文档使用z轴作为时间-因此它在时间上会向前/向后移动 我没有看到任何简单的pyqtgraph鼠标事件方法可以重新实现,也没有看到如何在PySide2中实现这一点。在这个虚拟函数中似乎有一些提示,但我不知道如何重新实现以捕获轮子 这是我创建窗口和50帧100x100像素噪声数据的最低工作代码:Python 如何在PyQtGraph ImageView中更改鼠标滚轮行为?,python,pyside2,pyqtgraph,Python,Pyside2,Pyqtgraph,我正在使用ImageView显示3D体积的2D切片(MRI扫描数据),并希望更改鼠标绑定以使用户更直观。默认情况下,鼠标滚轮会更改图像比例/缩放。相反,我希望控制盘切换到下一个/上一个切片——沿组成3D体积的一系列2D图像向前或向后移动。文档使用z轴作为时间-因此它在时间上会向前/向后移动 我没有看到任何简单的pyqtgraph鼠标事件方法可以重新实现,也没有看到如何在PySide2中实现这一点。在这个虚拟函数中似乎有一些提示,但我不知道如何重新实现以捕获轮子 这是我创建窗口和50帧100x10
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的滚轮事件并阻止事件传输,然后使用事件信息发出信号,指示是转到下一页还是上一页 导入系统 从PySide2.QtCore导入QObject、QEvent、信号 从PySide2.QtWidgets导入( QApplication, QHBoxLayout, QMainWindow, QWidget, ) 将pyqtgraph作为pg导入 将numpy作为np导入 类主窗口(QMainWindow): 定义初始化(自): super()。\uuuu init\uuuuu() self.DcmImgWidget=MyImageWidget() self.cw=QWidget() self.cw.setAutoFillBackground(真) self.setCentralWidget(self.cw) 布局=QHBoxLayout(self.cw) layout.addWidget(self.DcmImgWidget) 类帮助程序(QObject): 更改=信号(bool) 定义初始化(自我,小部件): super()。\uuuu初始化(小部件) self.\u widget=widget self.widget.installEventFilter(self) @财产 def小部件(自身): 返回self.\u小部件 def事件过滤器(自身、obj、事件): 如果obj是self.widget和event.type()==QEvent.Wheel: self.changed.emit(event.angleDelta().y()>0) 返回真值 return super().eventFilter(对象,事件) 类MyImageWidget(pg.ImageView): def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) self.ui.histogram.hide() self.ui.roiBtn.hide() self.ui.menuBtn.hide() #50帧100x100随机噪声 img=np.random.normal(大小=(50100100)) self.setImage(img) gv=self.ui.graphicsView helper=helper(gv.viewport()) helper.changed.connect(self.change\u页面) def更改页面(自身、状态): 自跳帧(如果状态为-1,则为1) def main(): app=QApplication(sys.argv) main=MainWindow() main.show() sys.exit(app.exec_()) 如果名称=“\uuuuu main\uuuuuuuu”: main()
谢谢!我花了一些时间才看到您在那里做了什么-让我检查一下我的理解-helper函数创建了一个新的信号“changed”,当鼠标滚轮事件到达“eventFilter”时使用该信号。“self.changed.emit”然后将“(event.angleDelta().y()>0)”的bool结果作为参数传递给连接的“change_page”方法。所以,为了捕获和处理鼠标点击和拖动,我假设我应该在“MyImageWidget”中创建一个新的信号、eventFilter条件和相应的slot方法。。。?