如何在单个QWidget中显示多张图片?若无法实现,如何设置Qt窗口位置避免重叠?
在单个QWidget中显示多张图片的解决方案
首先,要在同一个QWidget里展示多张图片,我们可以利用PyQt的布局管理器(比如QHBoxLayout横向布局或QVBoxLayout纵向布局),把多个pg.ImageView组件添加到同一个容器部件中,而不是每个图片单独开一个窗口。
修改后的代码示例如下:
import pyqtgraph as pg from PyQt5.QtWidgets import QMainWindow, QWidget, QHBoxLayout from PyQt5.QtCore import Qt import cv2 class PlotWindow(QMainWindow): def __init__(self, title, *args): super().__init__(*args) # 创建中心部件作为容器 central_widget = QWidget() self.setCentralWidget(central_widget) # 创建横向布局(如果要纵向排列就用QVBoxLayout) self.layout = QHBoxLayout(central_widget) self.setWindowTitle(title) self.show() def add_image(self, img_data): # 创建新的ImageView并添加到布局中 image_view = pg.ImageView() # 注意:cv2读取的是BGR格式,pyqtgraph默认显示RGB,若为彩色图需要转换 # 如果是灰度图可以跳过这一步 # img_data = cv2.cvtColor(img_data, cv2.COLOR_BGR2RGB) image_view.setImage(img_data) self.layout.addWidget(image_view) # 读取多张图片 img1 = cv2.imread("img_0_VIS.tif", cv2.IMREAD_UNCHANGED) img2 = cv2.imread("img_1_VIS.tif", cv2.IMREAD_UNCHANGED) # 假设你有第二张图 # 创建单个窗口并添加多张图片 main_window = PlotWindow("多图片展示窗口") main_window.add_image(img1) main_window.add_image(img2)
代码说明:
- 我们把
QMainWindow的中心部件设置为一个空的QWidget,然后给它绑定布局管理器。 - 通过
add_image方法可以动态添加任意数量的图片,每个图片对应一个独立的ImageView组件。 - 如果需要调整图片排列方向,把
QHBoxLayout换成QVBoxLayout即可。 - 要是你处理的是彩色图片,记得加上
cv2.COLOR_BGR2RGB的转换,否则颜色会显示异常。
让多个独立窗口不重叠的解决方案
如果你更倾向于保留多个独立窗口,只需要在创建窗口后调用move()方法手动设置每个窗口的位置,或者根据屏幕尺寸计算自动排列的位置。
示例代码:
import pyqtgraph as pg from PyQt5.QtWidgets import QMainWindow, QWidget from PyQt5.QtCore import Qt import cv2 class PlotWindow(QMainWindow): def __init__(self, title, *args): super().__init__(*args) self.plot_window = QWidget(self, Qt.Window) self.image = pg.ImageView(self.plot_window) self.plot_window.setWindowTitle(title) # 可以在这里预设窗口大小,方便计算位置 self.plot_window.resize(600, 400) # 读取图片 img1 = cv2.imread("img_0_VIS.tif", cv2.IMREAD_UNCHANGED) img2 = cv2.imread("img_1_VIS.tif", cv2.IMREAD_UNCHANGED) # 创建窗口并设置位置 window1 = PlotWindow("window1") window1.image.setImage(img1) # 第一个窗口放在屏幕左上角偏移(100,100)的位置 window1.plot_window.move(100, 100) window2 = PlotWindow("window2") window2.image.setImage(img2) # 第二个窗口放在第一个窗口的右侧,间隔20像素 window2.plot_window.move(window1.plot_window.x() + window1.plot_window.width() + 20, 100)
代码说明:
- 先给窗口设置固定大小(或者用默认大小),这样可以准确计算下一个窗口的位置。
move(x, y)方法接受坐标参数,x是水平位置,y是垂直位置,单位是像素。- 你也可以根据屏幕分辨率自动计算位置,比如用
QDesktopWidget获取屏幕尺寸,实现更智能的排列。
内容的提问来源于stack exchange,提问作者mahax
相关产品推荐
相关产品推荐

