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

PyQt5实现可滚动QGridLayout 解决setWidget参数类型报错问题

错误原因

你遇到的TypeError: setWidget(self, QWidget): argument 1 has unexpected type 'QGridLayout'报错,根源是QScrollArea.setWidget()仅接收QWidget类及其子类的实例作为入参,QGridLayout属于布局管理类,不属于可被挂载的控件,无法直接传入。
QScrollArea并非仅支持组合框、列表类控件,所有继承自QWidget的控件都可以放入滚动区域实现滚动效果,要给布局加滚动,只需要给布局套一层中间容器控件即可。

修复要点
  • 新建一个空白QWidget作为滚动区域的内容容器
  • 将QGridLayout设置到这个中间容器上,不要直接绑定到主窗口
  • 将中间容器传入scroll.setWidget()
  • 把QScrollArea添加到主窗口的布局中,否则滚动区域不会在窗口内显示
修正后可运行代码
import sys

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class PicClip(QWidget):

    def __init__(self):
        super().__init__()
        # Load image
        self.im = QPixmap("1.jpg")
        self.im1 = QPixmap("1.jpg")
        # Label 1
        self.label = QLabel()
        self.label.setPixmap(self.im)
        # Label 2
        self.label1 = QLabel()
        self.label1.setPixmap(self.im1)
        
        # 新建滚动区域内容容器
        self.content_widget = QWidget()
        # 初始化网格布局
        self.grid = QGridLayout()
        # 向网格添加控件
        self.grid.addWidget(self.label, 0, 1, alignment=Qt.AlignCenter)
        self.grid.addWidget(self.label1, 1, 1, alignment=Qt.AlignCenter)
        # 将网格布局绑定到内容容器
        self.content_widget.setLayout(self.grid)
        
        # 初始化滚动区域
        scroll = QScrollArea()
        scroll.setWidget(self.content_widget)
        scroll.setWidgetResizable(True)
        
        # 主窗口布局挂载滚动区域
        main_layout = QVBoxLayout()
        main_layout.addWidget(scroll)
        self.setLayout(main_layout)
        
        # 显示窗口
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = PicClip()
    sys.exit(app.exec_())

注意:运行前确保代码同目录下存在名为1.jpg的图片文件,否则会出现图片不显示的问题。

内容的提问来源于stack exchange,提问作者Edward Webb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 22:12:51