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
相关产品推荐
相关产品推荐

