一、布局管理器
1.1 概念
1.2 布局管理器的简单使用
先创建一个布局管理器对象,然后把所有的控件添加到布局管理器中,用布局管理器进行布局之后在放到父控件里例如:
label1 = QLabel("xx1")
label2 = QLabel("xx2")
label3 = QLabel("xx3")
label1.setStyleSheet("background:red")
label2.setStyleSheet("background:blue")
label3.setStyleSheet("background:black")
#创建垂直布局管理器
vl = QVBoxLayout()
#将子控件添加到垂直布局管理器中
vl.addWidget(label1)
vl.addWidget(label2)
vl.addWidget(label3)
#父控件应用布局后的布局管理器
self.setLayout(vl)
效果:
其他的功能:
1.3 QLayout
1.4 QBoxLayout
通常情况不会直接使用该类,而是使用其两个子类QHBoxlayout和QVBoxlayout。创建对象的时候不传父控件参数,只传递方向参数即可。方向参数有以下四种:
1.4.1 修改控件展示方向
setDirection(QBoxlayout.LeftToRight)
1.4.2 添加元素
lt.insertWidget(1,label) #在布局管理器lt中第1个位置插入label控件
lt.insertLayout(2,LT) #在布局管理器lt中第1个位置插入LT布局管理器
lt.layoutWidget(label) #将label控件移出lt布局管理器
label.setParent(None) #彻底将控件label移除
lt.addSpacing(100) #添加100px的空白
lt.insertSpacing(3,100) #在布局管理器的第三个位置插入一段100px的空白
1.4.3 伸缩控制
lt.addStretch(1) #向布局管理器添加一个宽度为1/n的空白,当窗口过小时,该空白可以被压缩消失。其中n是控件个数
lt.setStretchFactor(label,1) #设置label的伸缩系数为1(默认状态下,所有的控件伸缩系数为0)
lt.setStretchFactor(LT,1) #设置布局LT的伸缩系数为1(默认状态下,所有的控件伸缩系数为0)
二、表单布局
创建布局控件的时候不加父控件
2.1 添加行与插入行
#创建控件
name_label = QLabel("姓名:")
name_edit = QLineEdit()
sex_label = QLabel("性别:")
male_rb = QRadioButton("男")
female_rb = QRadioButton("女")
lt = QHBoxLayout()
lt.addWidget(sex_label)
lt.addWidget(male_rb)
lt.addWidget(female_rb)
age_label = QLabel("年龄:")
age_sb = QSpinBox()
age_sb.setValue(23)
#创建表单布局管理器,并把控件塞进布局管理器中
layout = QFormLayout()
#添加行
layout.addRow(name_label , name_edit) #添加姓名行
layout.addRow(lt) #添加性别选择行
layout.addRow(age_label, age_sb) #添加年龄选择行
#调用布局管理器
self.setLayout(layout)
效果:
补充:
插入行与添加行操作差不多,只是多了一个传入整型参数的位置来确定插入到哪一行。
2.2 获取行信息
行信息可能还会有一个角色的属性,一般hi有三种角色:
layout.rowCount() #获取布局管理器中标签总行数
layout.getWidgetPoisition(label) #获取label的位置信息 返回一个元素(行,角色类型)
layout.getLayoutPoisition(lt) #获取布局管理器lt的位置信息 返回一个元素(行,左/右测)
2.3 设置行
layout.setWidget(0,QFormLayout.LableRole,label) #在第0行设置一个label标签
layout.setlayout(1,QFormLayout.FieldRole,lt) #在第1行设置一个lt布局管理器
2.4 移除行
layout.removeRow(2) #移除并删除第2行的控件
layout.removeRow(label) #移除label所在的行
layout.removeWidget(lable) #仅移除label控件
layout.takeRow(1) #仅移除第2行控件,不删除(可能会影响布局,最好还是删除或隐藏)
2.5 获取标签
layout.labelForField(label) #获取label对象
2.6 行的包装策略
2.7 表单内容对齐方式和间距
layout.setFormAlignment(Qt.AlignVCenter | Qt.AlignLeft) #设置水平左对齐垂直居中
layout.setLableAlignment(Qt.AlignRight) #设置标签右对齐
layout.setVerticalSpacing(60) #设置垂直标签距离为60px
2.8 字段增长策略
三、网格布局QGridLayout
3.1 创建
label1 = QLabel("标签1")
label1.setStyleSheet("Background :blue")
label2 = QLabel("标签2")
label2.setStyleSheet("Background :red")
label3 = QLabel("标签3")
label3.setStyleSheet("Background :yellow")
#创建网格布局控件
gl = QGridLayout()
gl.addWidget(label1, 0, 0) #设置label1处于第0行0列位置
gl.addWidget(label2, 0, 1)
gl.addWidget(label3, 1, 0, 1, 2) #设置label3处于第1行0列且宽度为1长度为2
3.2 设置行高与列高范围
gl.setColumnMinimumWidth(0,100) #设置布局控件中第0列宽度最小为100px
gl.setRowMinimumHeight(0,50) #设置布局控件中第0行最小宽度为50px
gl.setRowStretch(0,1) #设置第0行拉伸系数为1
gl.setColumnStretch(0,0.5) #设置第0列拉伸系数为0.5
3.3 设置控件间距
gl.setVerticalSpacing(60) #设置gl布局控件中各子控件的垂直间距为60px
gl.settHorizonalSpacing(60) #设置gl布局控件中各子控件的水平间距为60px
四、堆叠布局QStackLayout
设置堆叠布局时一定要按照以下步骤进行,否则会出现问题。
步骤:
1、创建一个布局管理器对象
2、把布局管理器对象设置为父控件或父布局管理器对象
3、通过布局管理器对象布局子控件
控件尺寸策略:
label1.setSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed) #设置label1为默认大小,不可拉伸