Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在PyQtGraph ImageView中更改鼠标滚轮行为?_Python_Pyside2_Pyqtgraph - Fatal编程技术网

Python 如何在PyQtGraph ImageView中更改鼠标滚轮行为?

Python 如何在PyQtGraph ImageView中更改鼠标滚轮行为?,python,pyside2,pyqtgraph,Python,Pyside2,Pyqtgraph,我正在使用ImageView显示3D体积的2D切片(MRI扫描数据),并希望更改鼠标绑定以使用户更直观。默认情况下,鼠标滚轮会更改图像比例/缩放。相反,我希望控制盘切换到下一个/上一个切片——沿组成3D体积的一系列2D图像向前或向后移动。文档使用z轴作为时间-因此它在时间上会向前/向后移动 我没有看到任何简单的pyqtgraph鼠标事件方法可以重新实现,也没有看到如何在PySide2中实现这一点。在这个虚拟函数中似乎有一些提示,但我不知道如何重新实现以捕获轮子 这是我创建窗口和50帧100x10

我正在使用ImageView显示3D体积的2D切片(MRI扫描数据),并希望更改鼠标绑定以使用户更直观。默认情况下,鼠标滚轮会更改图像比例/缩放。相反,我希望控制盘切换到下一个/上一个切片——沿组成3D体积的一系列2D图像向前或向后移动。文档使用z轴作为时间-因此它在时间上会向前/向后移动

我没有看到任何简单的pyqtgraph鼠标事件方法可以重新实现,也没有看到如何在PySide2中实现这一点。在这个虚拟函数中似乎有一些提示,但我不知道如何重新实现以捕获轮子

这是我创建窗口和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的滚轮事件并阻止事件传输,然后使用事件信息发出信号,指示是转到下一页还是上一页

导入系统 从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方法。。。?