QSlider 值更改后 Pyqtgraph ImageView 未更新
Pyqtgraph ImageView not updating after QSlider value changed
我正在开发 PyQt5 + pyqtgraph 用户界面。主要想法是拥有一个图像查看器,我可以使用 Main Window 中的小部件对其进行更新,例如滑块、行编辑、按钮......现在我在移动切片器时无法更新图像。它连接到预期的功能,但 ImageViewer 上的图像始终保持相同(第一个)。我该如何解决这个问题?我知道 pyqtgraph ImageViewer 可以处理 3D 数组,但在未来,我将不得不添加多个将由同一个滑块更新的查看器。这是我的代码:
我使用的这个 HDF5 文件是一个 (2048, 2048, 10) 大小的数组(里面有 10 uint16 个图像)。
from PyQt5 import QtGui, QtWidgets, uic
import pyqtgraph as pg
import numpy as np
import os, sys, h5py
class ZoomGUI:
def __init__(self, parent=None):
self.ui = uic.loadUi(os.path.dirname(os.path.realpath(__file__)) + '/GUI/ZoomGUI.ui')
self.file_path = "recon/tomo-2048x2048x10_16bit.h5"
#Configure slices slicer
self.number_of_slices = self.get_number_of_slices()
self.ui.slicesSlider.setMaximum(self.number_of_slices-1)
self.ui.slicesSlider.valueChanged.connect(self.imageView)
self.updateImage()
#Add image widget
self.ui.ImageWidget.setLayout(QtGui.QVBoxLayout())
self.ui.ImageWidget.layout().addWidget(self.imv)
def imageView(self,slice_number):
self.imv = pg.ImageView()
self.imagedata = self.get_image(slice_number)
print(self.imagedata)
self.imv.setImage(self.imagedata)
def updateImage(self):
actual_slice = int(self.ui.slicesSlider.value())
self.imageView(actual_slice)
#File related functions
def get_image(self, slice_number):
h5 = h5py.File(self.file_path, "r")
data = h5["slices"][slice_number]
h5.close()
return(data)
def get_number_of_slices(self):
h5 = h5py.File(self.file_path, "r")
size = len(h5["slices"])
h5.close()
return(size)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
ZoomGUI = ZoomGUI()
ZoomGUI.ui.show()
app.exec_()
这是 .ui 文件。它只有滑块和一个 QWidget 小部件。
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1132</width>
<height>880</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QGridLayout" name="ImageWidgetLayout">
<item row="0" column="0">
<widget class="QWidget" name="ImageWidget" native="true"/>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>PushButton</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QSlider" name="slicesSlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1132</width>
<height>26</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
您正在创建一个尚未添加到 window 中的新 ImageView,因此您看不到更改,解决方案是只创建一次 ImageView,然后重新使用它
class ZoomGUI:
def __init__(self, parent=None):
self.ui = uic.loadUi(
os.path.dirname(os.path.realpath(__file__)) + "/GUI/ZoomGUI.ui"
)
self.file_path = "recon/tomo-2048x2048x10_16bit.h5"
# Add image widget
lay = QtGui.QVBoxLayout(self.ui.ImageWidget)
self.imv = pg.ImageView()
lay.addWidget(self.imv)
# Configure slices slicer
self.number_of_slices = self.get_number_of_slices()
self.ui.slicesSlider.setMaximum(self.number_of_slices - 1)
self.ui.slicesSlider.valueChanged.connect(self.imageView)
self.imageView(self.ui.slicesSlider.value())
def imageView(self, slice_number):
imagedata = self.get_image(slice_number)
print(imagedata)
self.imv.setImage(imagedata)
def get_image(self, slice_number):
h5 = h5py.File(self.file_path, "r")
data = h5["slices"][slice_number]
h5.close()
return data
def get_number_of_slices(self):
h5 = h5py.File(self.file_path, "r")
size = len(h5["slices"])
h5.close()
return size
我正在开发 PyQt5 + pyqtgraph 用户界面。主要想法是拥有一个图像查看器,我可以使用 Main Window 中的小部件对其进行更新,例如滑块、行编辑、按钮......现在我在移动切片器时无法更新图像。它连接到预期的功能,但 ImageViewer 上的图像始终保持相同(第一个)。我该如何解决这个问题?我知道 pyqtgraph ImageViewer 可以处理 3D 数组,但在未来,我将不得不添加多个将由同一个滑块更新的查看器。这是我的代码:
我使用的这个 HDF5 文件是一个 (2048, 2048, 10) 大小的数组(里面有 10 uint16 个图像)。
from PyQt5 import QtGui, QtWidgets, uic
import pyqtgraph as pg
import numpy as np
import os, sys, h5py
class ZoomGUI:
def __init__(self, parent=None):
self.ui = uic.loadUi(os.path.dirname(os.path.realpath(__file__)) + '/GUI/ZoomGUI.ui')
self.file_path = "recon/tomo-2048x2048x10_16bit.h5"
#Configure slices slicer
self.number_of_slices = self.get_number_of_slices()
self.ui.slicesSlider.setMaximum(self.number_of_slices-1)
self.ui.slicesSlider.valueChanged.connect(self.imageView)
self.updateImage()
#Add image widget
self.ui.ImageWidget.setLayout(QtGui.QVBoxLayout())
self.ui.ImageWidget.layout().addWidget(self.imv)
def imageView(self,slice_number):
self.imv = pg.ImageView()
self.imagedata = self.get_image(slice_number)
print(self.imagedata)
self.imv.setImage(self.imagedata)
def updateImage(self):
actual_slice = int(self.ui.slicesSlider.value())
self.imageView(actual_slice)
#File related functions
def get_image(self, slice_number):
h5 = h5py.File(self.file_path, "r")
data = h5["slices"][slice_number]
h5.close()
return(data)
def get_number_of_slices(self):
h5 = h5py.File(self.file_path, "r")
size = len(h5["slices"])
h5.close()
return(size)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
ZoomGUI = ZoomGUI()
ZoomGUI.ui.show()
app.exec_()
这是 .ui 文件。它只有滑块和一个 QWidget 小部件。
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1132</width>
<height>880</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<layout class="QGridLayout" name="ImageWidgetLayout">
<item row="0" column="0">
<widget class="QWidget" name="ImageWidget" native="true"/>
</item>
</layout>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>PushButton</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QSlider" name="slicesSlider">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1132</width>
<height>26</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
您正在创建一个尚未添加到 window 中的新 ImageView,因此您看不到更改,解决方案是只创建一次 ImageView,然后重新使用它
class ZoomGUI:
def __init__(self, parent=None):
self.ui = uic.loadUi(
os.path.dirname(os.path.realpath(__file__)) + "/GUI/ZoomGUI.ui"
)
self.file_path = "recon/tomo-2048x2048x10_16bit.h5"
# Add image widget
lay = QtGui.QVBoxLayout(self.ui.ImageWidget)
self.imv = pg.ImageView()
lay.addWidget(self.imv)
# Configure slices slicer
self.number_of_slices = self.get_number_of_slices()
self.ui.slicesSlider.setMaximum(self.number_of_slices - 1)
self.ui.slicesSlider.valueChanged.connect(self.imageView)
self.imageView(self.ui.slicesSlider.value())
def imageView(self, slice_number):
imagedata = self.get_image(slice_number)
print(imagedata)
self.imv.setImage(imagedata)
def get_image(self, slice_number):
h5 = h5py.File(self.file_path, "r")
data = h5["slices"][slice_number]
h5.close()
return data
def get_number_of_slices(self):
h5 = h5py.File(self.file_path, "r")
size = len(h5["slices"])
h5.close()
return size