
公众号:uncle39py
2023/05/04阅读:11主题:默认主题
90.PyQt布局管理器
前面几节介绍了PyQt最常用的几个基础控件,有:按钮、单行多行文本框、标签,这些暂时可以满足我们做小工具的需求了
本着从大的框架出发来讲解PyQt,所以基础控件的介绍先暂告一段落,后续再补充
本节开始介绍布局管理器
一.布局管理器介绍
1.布局管理器的作用:
-
以某一种规则将子控件摆在父控件中,这里的规则有:垂直布局/水平布局/表单布局/表格布局这几种;
-
当可用空间发生改变时,布局管理器会自动调整控件的位置和大小;其中窗口大小改变、内容改变、控件隐藏等都会导致可用空间发生变化
布局管理器的继承结构图如下:

2.布局管理器的简单使用
本质:父控件管布局管理器,布局管理器管子控件
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("布局管理器学习")
self.resize(500,500)
self.init_ui()
def init_ui(self):
label1 = QLabel("1")# 可以不设置其父控件
label2 = QLabel("2")
label3= QLabel("3")
v_layout = QVBoxLayout() #1.创建布局管理器对象
v_layout.addWidget(label1) #2.让布局管理器对象接管子控件
v_layout.addWidget(label2)
v_layout.addWidget(label3)
self.setLayout(v_layout) #3.内部会界定父子关系
#注意点:
# 1.父控件窗口中,不直接管理子控件,子控件由布局管理器接管
# 2.子控件可以不设置它的父控件,self.setLayout(v_layout)系统会为v_layout及其里面的控件统一指定父控件self
# 3.可以通过print(self.children())来验证窗口父控件的子控件:包含布局管理器及三个标签
二.基类QLayout
-
addWidget()
往布局内添加控件 -
addLayout()
布局的嵌套:往布局内添加布局 -
setContentsMargins(...)
设置布局管理器与父控件的间距 -
setSpacing()
设置布局管理器接管的控件互相之间的间距 -
布局内部的控件可以被另外的控件替换(
replaceWidget()
),被替换的控件不受布局管理器控制,需要显示的写一条隐藏语句,或者设置被替换的控件的父控件为None(没人引用,会在内存中被清除)
三.QBoxLayout/QHBoxLayout/QVBoxLayout
QBoxLayout
:盒子布局,使用的时候需要设置方向:从上到下,从下到上,从左到右,从右到左;我们直接使用它的子类水平布局/垂直布局即可
-
insertWidget(...)
插入控件 -
insertLayout(...)
插入布局 -
removeWidget(...)
移除布局,从标签管理器中移除,移除后的控件不受布局管理器控制,需要显示的写一条隐藏语句,或者设置被移除的控件的父控件为None(没人引用,会在内存中被清除) -
addSpacing(self,int)
添加空白,空白尺寸不随窗口变化 -
insertSpacing(self,int,int)
插入空白
以下为重点:QBoxLayout的伸缩因子
QBoxLayout的addWidget(...)方法参数中,默认stretch=0,stretch代表伸缩因子;
含义是:当前控件的空间大小,在整个布局中所有控件的总的空间大小的权重(比例),如果窗口控件变化,每个控件会随着这个权重重新分配空间

QBoxLayout的addStretch(int): 插入空白的空间,大小根据伸缩因子的权重来分配.

特殊情况:当每个控件都没有指定伸缩因子,而控件中间插入了一个伸缩因子:

setStretchFactor(widget/layout,1)
重新设置某个控件或子布局的伸缩因子
QHBoxLayout/QVBoxLayout
:水平布局/垂直布局,这两个类本身没有新的东西,只是在构造函数中指定了布局的方向为水平/垂直而已
四.表单布局QFormLayout
表单布局直观样子:左边列是标签,右边列是输入框,两列多行,每行为一组;
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QFormLayout")
self.resize(500,500)
self.init_ui()
def init_ui(self):
name_label=QLabel("姓名")
age_label=QLabel("年龄")
name_le=QLineEdit()
age_le=QLineEdit()
layout = QFormLayout()
layout.addRow(name_label,name_le)
layout.addRow(age_label,age_le)
self.setLayout(layout)
其中添加行的几个方法:
后续如果要修改标签,需要获取到标签对象,方法如下:

label_name = layout.labelForField(name_le)
label_name.setText("xxx")
插入行的几个方法:
setHorizontalSpacing(int)
设置列于列的间距
setVerticalSpacing(int)
设置行与行的间距
其他操作涉及(用到在查):
-
获取行信息 -
修改行 -
移除行(包含是否删除控件两种方式) -
行的包装策略,即:当行的宽度不够大的时候,如何布局标签和字段的位置 -
字段增长策略,即:当窗口尺寸变大时,字段尺寸是否跟着变大
五.栅格布局(表格布局)
表单布局是两列多行,栅格布局则是多列多行,可以理解成excel表格


设置间距
-
设置行与行间距 setVerticalSpacing(int)
-
设置列与列间距 setHorizontalSpacing(int)
-
同时设置水平与垂直间距为同一个值 setSpacing(int)
设置拉伸因子
需分别设置某行或某列的拉伸因子(即:额外多余空间的分配,详细查看上边QBoxLayout)
涉及两个方法:setColumnStretch()
,setRowStretch()
其他操作涉及(用到在查)
-
获取位置: getItemPosition(self,int)
-
获取位置对应的控件: itemAtPosition(int row,int column).widget()
-
设置单元格最小列宽,最小行高 -
信息获取:行数、列数
作者介绍
