🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 简介 **布局** * 一个pyqt窗口中可以有多个控件 * 所谓布局,指的就是多个控件在窗口中的展示方式 * 布局方式大致分为: 绝对布局,水平布局,竖直布局,网格布局,表单布局 **布局方法** * 布局中可以添加控件,使用addWidget()方法 * 布局中也可以再添加布局,使用addLayout()方法 **绝对布局** 绝对布局是通过在窗口程序中指定每一个控件的显示**坐标和大小**来实现 优点: 可以直接定位每个控件的位置 缺点 如果改变一个窗口的大小,控件的大小和位置不会随之改变 如果修改布局,比如新增一个控件,必须全部重新布局,很繁琐 **框布局** QBoxLayout * 水平布局(QHBoxLayout)和竖直布局(QVBoxLayout)都称为框布局 **水平布局** QHBoxLayout * 水平布局中,是按照**从左往右**的顺序添加控件 addWidget指定控件对齐方式 ![](https://box.kancloud.cn/1e9a925591b7c853997da7cb5fb077ff_691x307.png) **竖直布局** QVBoxLayout * 竖直布局采用QVBoxLayout,是采用**从上往下**的方式添加控件 **设置伸缩量** addStretch * 布局时要用到addStretch函数,设置stretch伸缩量后,按比例分配剩余控件 **网格布局** QGridLayout * QGridLayout(网格布局)是将窗口分割成行和列的网格来进行排序 * 使用addWidget添加控件 addWidget | 方法 | 说明 | | --- | --- | | addWidget(QWidget widget, int row, int col, int alignment=0) | 给网格添加控件,设置指定的行和列 | **表单布局** QFormLayout * 表单布局是label-field式的表单布局,顾名思义就是实现表单方式的布局 * 表单布局添加控件的方法为addRow(label, widget) # 绝对布局 ~~~ from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * import sys # 创建个应用程序 需要加上参数 app = QApplication(sys.argv) # 创建窗口 widget = QWidget() # 修改窗口大小 widget.resize(300, 400) # 设置窗口的标题 widget.setWindowTitle('绝对布局') # btn1 btn1 = QPushButton() btn1.setText('按钮1') # btn1显示 btn1.setParent(widget) btn1.move(100, 100) # btn2 btn2 = QPushButton() btn2.setText('按钮2') # btn2显示 btn2.setParent(widget) btn2.move(150, 150) # btn3 btn3 = QPushButton() btn3.setText('按钮3') # btn3显示 btn3.setParent(widget) btn3.move(200, 200) # 显示窗口 widget.show() # 系统安全退出 sys.exit(app.exec()) ~~~ # 水平布局 先要创建个布局控件layout,然后把按钮添加到布局中,然后把布局控件放到窗口中 ![](https://box.kancloud.cn/71ef855a463491a54ade05bfccea9e02_600x844.png) ~~~ from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * import sys # 创建个应用程序 需要加上参数 app = QApplication(sys.argv) # 创建窗口 widget = QWidget() # 修改窗口大小 widget.resize(300, 400) # 设置窗口的标题 widget.setWindowTitle('水平布局') # 创建布局控件 layout = QHBoxLayout() for ele in range(1, 6): # 创建按钮 btn = QPushButton() btn.setText(str(ele)) # 把按钮添加到布局中 # layout.addWidget(btn) # 第二个在中间显示 if ele == 2: layout.addWidget(btn, 0, Qt.AlignBottom) else: layout.addWidget(btn) # 把布局控件放到窗口中 widget.setLayout(layout) # 显示窗口 widget.show() # 系统安全退出 sys.exit(app.exec()) ~~~ # 竖直布局 ![](https://box.kancloud.cn/7f3fb707764ef0cc99c5848087077fac_600x844.png) ~~~ from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * import sys # 创建个应用程序 需要加上参数 app = QApplication(sys.argv) # 创建窗口 widget = QWidget() # 修改窗口大小 widget.resize(300, 400) # 设置窗口的标题 widget.setWindowTitle('竖直布局') # 创建布局控件 layout = QVBoxLayout() for ele in range(1, 6): # 创建按钮 btn = QPushButton() btn.setText(str(ele)) # 设置伸缩值 if ele == 2: layout.addStretch(1) else: layout.addStretch(2) # 把按钮添加到布局中 layout.addWidget(btn) # 把布局控件放到窗口中 widget.setLayout(layout) # 显示窗口 widget.show() # 系统安全退出 sys.exit(app.exec()) ~~~ # 表单布局 ![](https://box.kancloud.cn/0bb35e8cb91f1b456138dbd52d05a08c_600x844.png) ~~~ from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * import sys # 创建个应用程序 需要加上参数 app = QApplication(sys.argv) # 创建窗口 widget = QWidget() # 修改窗口大小 widget.resize(300, 400) # 设置窗口的标题 widget.setWindowTitle('表单布局') # 创建布局控件 layout = QFormLayout() # 添加控件 layout.addRow(QLabel('姓名'), QLineEdit()) layout.addRow(QLabel('年级'), QLineEdit()) layout.addRow(QLabel('电话'), QLineEdit()) # 把布局控件放到窗口中 widget.setLayout(layout) # 显示窗口 widget.show() # 系统安全退出 sys.exit(app.exec()) ~~~ # 布局嵌套 ![](https://box.kancloud.cn/25a0a55b9d9f7151769513a531af9551_764x444.png) ~~~ from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * import sys # 创建个应用程序 需要加上参数 app = QApplication(sys.argv) # 创建窗口 widget = QWidget() # 修改窗口大小 widget.resize(300, 200) # 设置窗口的标题 widget.setWindowTitle('布局嵌套') # 创建布局控件 layout = QHBoxLayout() # 第一部分 layout1 = QHBoxLayout() layout1.addWidget(QPushButton('1')) layout1.addWidget(QPushButton('2')) # 第一部分添加到外层布局中 layout.addLayout(layout1) # 第二部分 layout2 = QVBoxLayout() layout2.addWidget(QPushButton('3')) layout2.addWidget(QPushButton('4')) layout.addLayout(layout2) # 第三部分 layout3 = QFormLayout() layout3.addRow(QPushButton('5'), QPushButton('6')) layout3.addRow(QPushButton('7'), QPushButton('8')) layout.addLayout(layout3) # 第四部分 layout4 = QVBoxLayout() layout4.addWidget(QPushButton('9')) layout4.addWidget(QPushButton('10')) layout4.addWidget(QPushButton('11')) layout4.addWidget(QPushButton('12')) layout.addLayout(layout4) # 把布局控件放到窗口中 widget.setLayout(layout) # 显示窗口 widget.show() # 系统安全退出 sys.exit(app.exec()) ~~~