2.布局管理器

1. 水平布局管理器(QHBoxLayout)

用于水平排列子组件,子组件按照从左到右的顺序水平排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import sys

from PySide6.QtWidgets import QApplication, QHBoxLayout, QWidget, QPushButton, QVBoxLayout


class MyWidget(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # 调用父类的初始化方法
self.setWindowTitle("Cyber psychosis") # 设置窗口标题
self.resize(400, 200) # 设置窗口大小,单位为像素
self.setLayout(QHBoxLayout()) # 设置主窗口为水平布局
self.setup_ui()

def setup_ui(self):
# 创建两个按钮
button1 = QPushButton('Button 1')
button2 = QPushButton('Button 2')

# 获取当前布局并将按钮添加到布局中
layout = self.layout()
layout.addWidget(button1)
layout.addWidget(button2)


if __name__ == '__main__':
app = QApplication(sys.argv) # 创建APP,将运行脚本时(可能的)的其他参数传给Qt以初始化
widget = MyWidget() # 实例化一个MyWidget类对象
widget.show() # 显示窗口
sys.exit(app.exec()) # 正常退出APP:app.exec()关闭app,sys.exit()退出进程

2. 垂直布局管理器(QVBoxLayout)

用于垂直排列子组件,按照从上到下的顺序垂直排列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import sys

from PySide6.QtWidgets import QApplication, QHBoxLayout, QWidget, QPushButton, QVBoxLayout


class MyWidget(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # 调用父类的初始化方法
self.setWindowTitle("Cyber psychosis") # 设置窗口标题
self.resize(400, 200) # 设置窗口大小,单位为像素
self.setLayout(QVBoxLayout()) # 设置主窗口为垂直布局
self.setup_ui()

def setup_ui(self):
# 创建两个按钮
button1 = QPushButton('Button 1')
button2 = QPushButton('Button 2')

# 获取当前布局并将按钮添加到布局中
layout = self.layout()
layout.addWidget(button1)
layout.addWidget(button2)


if __name__ == '__main__':
app = QApplication(sys.argv) # 创建APP,将运行脚本时(可能的)的其他参数传给Qt以初始化
widget = MyWidget() # 实例化一个MyWidget类对象
widget.show() # 显示窗口
sys.exit(app.exec()) # 正常退出APP:app.exec()关闭app,sys.exit()退出进程

3. 网格布局管理器(QGridLayout)

用于将子组件放置在一个网格中,每个子组件可以占据一个或多个网格单元
这个管理器相当于把窗口划分成多个网格,就像excel表格那样,每个格子可以放一个子组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import sys

from PySide6.QtWidgets import QApplication, QGridLayout, QHBoxLayout, QWidget, QPushButton, QVBoxLayout
from PySide6.QtCore import Qt


class MyWidget(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # 调用父类的初始化方法
self.setWindowTitle("Cyber psychosis") # 设置窗口标题
self.resize(400, 200) # 设置窗口大小,单位为像素
self.setLayout(QGridLayout()) # 设置主窗口为水平布局
self.setup_ui()

def setup_ui(self):
# 创建两个按钮
button1 = QPushButton('Button 1')
button2 = QPushButton('Button 2')
button3 = QPushButton('Button 3')

# 获取当前布局并将按钮添加到布局中
layout = self.layout()
layout.addWidget(button1, 0, 0)
layout.addWidget(button2, 0, 1)
layout.addWidget(button3, 1, 0, 1, 2)

# 设置组件之间的间隔
layout.setSpacing(10)

# 设置组件在管理器中的对其方式
layout.setAlignment(button1, Qt.AlignTop | Qt.AlignLeft)

# 设置组件的拉伸因子,用于放缩窗口时,组件等比例放大或者缩小
# setRowStretch设置行的拉伸因子
layout.setRowStretch(0, 1)
# setColumnStretch设置行的拉伸因子
layout.setColumnStretch(1, 1)


if __name__ == '__main__':
app = QApplication(sys.argv) # 创建APP,将运行脚本时(可能的)的其他参数传给Qt以初始化
widget = MyWidget() # 实例化一个MyWidget类对象
widget.show() # 显示窗口
sys.exit(app.exec()) # 正常退出APP:app.exec()关闭app,sys.exit()退出进程

可以使用以下标志位来设置对齐方式:

水平对齐标志(Qt.AlignmentFlag):

  • Qt.AlignLeft:左对齐
  • Qt.AlignRight:右对齐
  • Qt.AlignHCenter:水平居中
  • Qt.AlignJustify:两端对齐(在水平方向上拉伸以填充网格单元)

垂直对齐标志(Qt.AlignmentFlag):

  • Qt.AlignTop:顶部对齐
  • Qt.AlignBottom:底部对齐
  • Qt.AlignVCenter:垂直居中

这些标志位可以通过按位或运算来组合使用,例如 Qt.AlignTop | Qt.AlignLeft 表示左上角对齐。

4. 表单布局控制器(QFormLayout)

用于将标签和输入字段配对显示,适用于创建表单式的用户界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import sys

from PySide6.QtWidgets import QApplication, QFormLayout, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QWidget, \
QPushButton, \
QVBoxLayout
from PySide6.QtCore import Qt


class MyWidget(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # 调用父类的初始化方法
self.setWindowTitle("Cyber psychosis") # 设置窗口标题
# self.resize(400, 200) # 设置窗口大小,单位为像素
self.setLayout(QFormLayout()) # 设置主窗口为水平布局
self.setup_ui()

def setup_ui(self):
# 创建标签和单行文本框
label1 = QLabel('Name:')
line_edit1 = QLineEdit()

label2 = QLabel('Age:')
line_edit2 = QLineEdit()

# 获取布局
layout = self.layout()
# 添加标签和字段对,每一对成为布局中的一行,还有相应设列的函数
layout.addRow(label1, line_edit1)
layout.addRow(label2, line_edit2)

# 添加水平和垂直方向的间隔
layout.setHorizontalSpacing(15)
layout.setVerticalSpacing(10)


if __name__ == '__main__':
app = QApplication(sys.argv) # 创建APP,将运行脚本时(可能的)的其他参数传给Qt以初始化
widget = MyWidget() # 实例化一个MyWidget类对象
widget.show() # 显示窗口
sys.exit(app.exec()) # 正常退出APP:app.exec()关闭app,sys.exit()退出进程

4. 堆叠布局管理器(QStackedLayout)

用于在同一位置显示多个子组件,但只显示其中一个。
常用于实现选项卡式的界面或者在同一区域切换显示不同的组件。
举个例子来说就一个萝卜坑种了好几个种子,我想让哪个种子出来就让哪个出来,但是也只能有一个种子长出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import sys

from PySide6.QtWidgets import QApplication, QLabel, QLineEdit, QStackedLayout, \
QWidget, \
QPushButton, \
QVBoxLayout
from PySide6.QtCore import Qt


class MyWidget(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # 调用父类的初始化方法
self.setWindowTitle("Cyber psychosis") # 设置窗口标题
# self.resize(400, 200) # 设置窗口大小,单位为像素
self.setLayout(QStackedLayout()) # 设置主窗口为水平布局
self.setup_ui()

def setup_ui(self):
# 创建一个按钮和一个标签组件
button1 = QPushButton('Page 1')
label = QLabel('Page 2')

layout = self.layout() # 获取主窗口的布局管理器

# 把两个组件添加到管理器中
layout.addWidget(button1)
layout.addWidget(label)

# 设置初始显示索引为0的组件(Page 1)
layout.setCurrentIndex(0)

# 给按钮添加点击事件,切换显示不同的部件,当点击按钮时切换显示第二个组件
button1.clicked.connect(lambda: layout.setCurrentIndex(1))


if __name__ == '__main__':
app = QApplication(sys.argv) # 创建APP,将运行脚本时(可能的)的其他参数传给Qt以初始化
widget = MyWidget() # 实例化一个MyWidget类对象
widget.show() # 显示窗口
sys.exit(app.exec()) # 正常退出APP:app.exec()关闭app,sys.exit()退出进程