文章目录
- 布局管理
- 布局步骤
- QHBoxLayout & QVBoxLayout
- QFormLayout
- QGridLayout
布局管理
布局,按照一定规则,将子控件放入父控件
- 手动布局;绝对布局move & resize & resizeEvent
- 布局管理器,实现快速布局,是控件的定位策略。
布局步骤
- 创建布局对象(没有父控件)
from PyQt5.QtWidgets import QLayout, QBoxLayout, QHBoxLayout, QVBoxLayout, QGridLayout
def set_ui(self):
# 1.实例化布局对象
hb = QHBoxLayout()
# 2. 布局格式
hb.setContentsMargins(10, 20, 30, 40) # 外边距
hb.setSpacing(100) # 子控件间距
# hb.setAlignment(Qt.AlignmentFlag.AlignCenter)
# 3. 添加子控件, 创建子控件没有父控件
l1 = QLabel("part1")
l1.setStyleSheet("background-color: lightblue;")
l2 = QLabel("part2")
l2.setStyleSheet("background-color: pink;")
hb.addWidget(l1)
hb.addSpacing(100) # 添加空白,控制布局
hb.insertSpacing(0, 100)
hb.addWidget(l2)
# 替换子控件
hb.replaceWidget(l2, l3) # 能实现效果就不用隐藏l2
l2.hide() # 隐藏并没有释放内存
# 移除控件
hb.removeWidget(l3)
l3.hide()
# 添加子布局
vb = QVBoxLayout()
...
vb.addLayout(hb)
vb.addWidget(l4)
# 布局方向
hb.setDirection(hb.direction() + 1)
# 4. 父控件(QWidget对象) 添加布局,然后将布局中的子控件自动加入该父控件
self.setLayout(hb)
self.setLayoutDirection(Qt.LayoutDirection.RightToLeft)
- 设置布局格式
- 布局对象添加子控件,
创建子控件,不需父控件
- 父控件设置布局格式
QHBoxLayout & QVBoxLayout
伸缩因子
# 伸缩窗口时
hb.addWidget(l1, 1) # 占1份
hb.addWidget(l2, 3) # 占3份
hb.addStretch(4) # 4份的空白
hb.addWidget(l3, 1) # 占1份
# 单独为一个子控件设置伸缩因子
hb.setStetchFactor(l1, 10)
QFormLayout
表单布局,实现如下的布局:
def set_ui(self):
# 1.实例化布局对象
fl = QFormLayout() #
# 2. 设置样式
fl.setContentsMargins(10, 10, 10, 10)
fl.setSpacing(5) # 子控件之间的距离
# 3. 添加子控件
# 用户名 密码
username = QLabel("用户名:") # 不用父控件
ule = QLineEdit()
pwd = QLabel("密码:")
pwd_le = QLineEdit()
# 性别选择
sex_label = QLabel("性别:")
male = QRadioButton("男")
male.clicked.connect(lambda :print("选择的性别: 男"))
female = QRadioButton("女")
hb = QHBoxLayout()
hb.addWidget(male)
hb.addWidget(female)
# 登录按钮
login_btn = QPushButton("登录")
# 添加行
fl.addRow(username, ule) # widget, widget
fl.addRow(pwd, pwd_le)
fl.addRow(sex_label, hb) # widget, layout
fl.addRow(login_btn)
# fl.addRow("用户名(&n)", ule) # 添加一行,并设置快捷键关联 alt + n
# 4. 父控件 设置布局
self.setLayout(fl)
插入行
formLayout.insertRow(idx, ‘爱好’, xxx)
若索引超出范围,则在最后一行插入
获取控件位置
formLayout.getWidgetPosition(username)
formLayout.getLayoutPosition(hb)
formLayout.rowCount()
设置控件
formLayout.setWidget(0, QFormLayout.LabelRole, username)
formLayout.setWidget(0, QFormLayout.FieldRole, ule)
若一行被占用,只能设置label
删除一行
fl.removeRow(0) 输入索引,删除一行并释放子控件
fl.takeRow(2) 删除一行,未释放
fl.labelForField(ule) 获取label控件
设置行标签的策略
fl.setRowWrapPolicy(QFormLayout.RowWrapPolicy.WrapAllRows) 输入框在label的下面
# 表单的对齐
fl.setFormAlignment(Qt.AlignmentFlag.AlignCenter)
# label的对齐
fl.setLabelAlignment(Qt.AlignmentFlag.AlignRight)
fl.setVerticalSpacing(50) # 垂直方向 行间距
fl.setHorizontalSpacing(40) # 水平方向 控件间距