PyQt5布局管理器
布局分类
绝对定位:使用move方法将空间直接定死在某个坐标,不会随着窗口大小的改变而改变
可变布局:使用各种布局管理器,实现组件的位置和大小随着窗口的变化而变化
布局管理器
-
QHBoxLayout:水平布局管理器,水平大小自动变化,垂直大小不变
-
QVBoxLayout:垂直布局管理器,水平大小不变,垂直大小自动变化
-
QGridLayout:网格布局管理器,水平和垂直两个方向自动变化
-
QFormLayout:表单布局管理器,一行由两列组成,分别是显示和输入,水平大小自动变化,垂直大小不变
-
QSplitter:特殊的管理器,实际上是个控件,可以实现里面的子组件边界拖动功能
接口
方法 | 描述 |
addLayout(layout, stretch) | 设置窗口的布局管理器,stretch表示伸缩量(默认值0) |
addWidget(widget, stretch, aligment) | 添加控件到布局管理器中 |
addSpacing(int) | 在控件之间添加间距,间距大小固定,单位是像素 |
addStretch(stretch) | 在布局管理器中添加一个可伸缩的布局管理器 |
addWidget(widget, x, y) | 网管布局管理器方法,在(x,y)处添加控件 |
addWidget(widget, x, y, row,column, aligment) | 网管布局管理器方法,从(x,y)开始row行column列出添加控件(跨格) |
addRow(label,edit) | 表单布局管理器方法,添加一行 |
例子
import random import string import sys from PyQt5.QtCore import Qt, QRect from PyQt5.QtGui import QPainter, QFont, QColor, QPen, QBrush from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QPushButton, QVBoxLayout, QLabel, QGridLayout, \ QFormLayout, QLineEdit, QSplitter class MyWidget(QWidget): def __init__(self): super(MyWidget, self).__init__() # 水平布局管理 # hboxlayout = QHBoxLayout() # # 设置所有组件间距,单位是像素 # # hboxlayout.setSpacing(50) # hboxlayout.addWidget(QPushButton('1'), 1) # # 添加空隙,单位是像素 # # hboxlayout.addSpacing(50) # hboxlayout.addWidget(QPushButton('2'), 1) # hboxlayout.addWidget(QPushButton('3'), 1) # hboxlayout.addWidget(QPushButton('4'), 2) # self.setLayout(hboxlayout) # 垂直布局管理 # vboxlayout = QVBoxLayout() # vboxlayout.addWidget(QLabel('1'), 1) # # 添加可伸缩的空隙 # # vboxlayout.addStretch(1) # vboxlayout.addWidget(QLabel('2'), 1) # vboxlayout.addWidget(QLabel('3'), 1) # vboxlayout.addWidget(QLabel('4'), 2) # self.setLayout(vboxlayout) # 网格布局管理 # gridLayout = QGridLayout() # self.setLayout(gridLayout) # # gridLayout.addWidget(QPushButton('1'), 0, 0) # gridLayout.addWidget(QPushButton('2'), 0, 1) # gridLayout.addWidget(QPushButton('3'), 0, 2) # gridLayout.addWidget(QPushButton('4'), 1, 0) # # gridLayout.addWidget(QPushButton('5'), 1, 1) # # gridLayout.addWidget(QPushButton('6'), 1, 2) # gridLayout.addWidget(QPushButton('7'), 2, 0) # # gridLayout.addWidget(QPushButton('8'), 2, 1) # # gridLayout.addWidget(QPushButton('9'), 2, 2) # # # 一个组件占用多个格子 # gridLayout.addWidget(QPushButton('A'), 1, 1, 2, 2) # 表单布局管理 # formLayout = QFormLayout() # self.setLayout(formLayout) # # formLayout.addRow(QLabel('用户名'), QLineEdit()) # formLayout.addRow(QLabel('密 码'), QLineEdit()) # 可拖动布局管理 hboxlayout = QHBoxLayout() self.setLayout(hboxlayout) splitter = QSplitter() hboxlayout.addWidget(splitter) splitter.addWidget(QPushButton('1')) splitter.addWidget(QPushButton('2')) if __name__ == '__main__': app = QApplication(sys.argv) w = MyWidget() w.resize(500, 300) w.move(300, 300) w.setWindowTitle('Simple') w.show() sys.exit(app.exec_())