You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:58:11