布局,按照一定规则,将子控件放入父控件

from PyQt5.QtWidgets import QLayout, QBoxLayout, QHBoxLayout, QVBoxLayout, QGridLayoutdef 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) # 能实现效果就不用隐藏l2l2.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)
创建子控件,不需父控件
伸缩因子
# 伸缩窗口时
hb.addWidget(l1, 1) # 占1份
hb.addWidget(l2, 3) # 占3份
hb.addStretch(4) # 4份的空白
hb.addWidget(l3, 1) # 占1份 # 单独为一个子控件设置伸缩因子
hb.setStetchFactor(l1, 10)

表单布局,实现如下的布局:

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, widgetfl.addRow(pwd, pwd_le)fl.addRow(sex_label, hb) # widget, layoutfl.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) # 水平方向 控件间距
下一篇:08 SQL优化