PySide6的网格对象,先从父布局或者parentWidget()函数中获取可用空间,然后将这些控件划分为行和列,由此产生很多单元格(类似与Excel单元格),可以把其它小部件(包括其它布局对象)添加到它的单元格中。
网格布局对象(QGrinLayout)的单元格是从第0行和第0列开始的,也就是第一个单元格是第0行和第0列的位置。
网格布局对象的行和列的行为是相同的,也就是说列和行都有相应的函数用于设置,下面有列的相关函数的使用。
每列都有一个最小宽度和一个拉伸因子(对应到行,也就是每行都有一个最小高度和拉伸因子)。
对于列,使用setColumnMinimumWidth()函数可以设置一个宽度值,所有添加的小部件的minimum width(宽度值),该列的最小宽度是这些宽度值的最大值。拉伸因子可以使用setColumnStretch()函数设置,列分配完最小宽度之后,会根据拉伸因子分配剩余控件。
列的宽度可以不同,如果希望两列具有相同的宽度,则必须将它们的最小宽度和拉伸因子设置为相同的值。可以使用setColumnMinimunWidth()和setColumnStretch()函数执行。
1、使用addWidget()函数添加其它控件对象到单元格(一个或者相邻的多个)
2、使用addLayout()函数添加嵌套的其它布局对象到单元格(比如水平/垂直布局对象)
3、使用addItem()函数添加空白对象到单元格。
QGridLayout网格对象将对添加进单元格的对象分配控件。
由于QGridLayout有行和列之分,因此相比V/QHBoxLayout多了几个参数:
- row----控件的行数,默认从0行开始。
- column----控件的列数,默认从0列开始。
- rowSpan---控件跨行的行数
- colSpan ----控件跨列的列数
在QGridLayout网格布局对象中,添加进去的控件可以占据多个单元格控件(多个单元格组合必须是一个矩形),类似与Excel中合并的单元格。
addItem()函数传递的参数:QLayoutItem。QLayoutItem是QSpaceItem的实例。所以这个函数的作用是填充空格。
下面是一段代码,代码中有详细的注释说明。
"""
文件名字:PySide6_QGridLayoutDemo
作者姓名:诚外无物
创建日期:2023/11/14
项目名称:chapter01
"""
import sys
from PySide6.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton, QLayoutItem, QSpacerItem, QSizePolicy, \
QLabel, QHBoxLayout, QLineEdit,QTextBrowser,QPlainTextEdit
class GridLayoutDemo(QWidget):
def __init__(self, parent=None):
super(GridLayoutDemo, self).__init__(parent)
self.setWindowTitle('网格布局(QGridLayout)案例')
# 创建网格布局对象
grid = QGridLayout()
# 把网格对象添加到主窗口中
self.setLayout(grid)
# 使用for循环,在网格对象的第1列添加7个单行文本框对象控件,在网格对象的第1行添加7个单行文本框对象控件
for i in range(1, 8):
rowEdit = QLineEdit('第%d行:第0列' % (i))
rowEdit.setReadOnly(True)
grid.addWidget(rowEdit, i, 0)
colEdit = QLineEdit('第0行:第%d列' % (i))
colEdit.setReadOnly(True)
grid.addWidget(colEdit, 0, i)
# 在网格对象的第0行第0列添加一个当行文本对象控件
col_rol_Edit = QLineEdit('第0行:第0列')
col_rol_Edit.setReadOnly(True)
grid.addWidget(col_rol_Edit, 0, 0, 1, 1)
'''
创建了一个QSpacerItem对象,它是一个用于在布局中创建空白的间隔项。
QSpacerItem的参数定义了其宽度、高度和大小策略。
在这里,宽度设为100,高度设为20,大小策略设为QSizePolicy.Maximum,
意味着这个间隔项会尽量保持其最大尺寸(100x20),但如果布局需要的话,它也可以缩小。
'''
spacer = QSpacerItem(100, 100, QSizePolicy.Maximum)
'''
在网格布局对象的第0行和第0列单元格添加了QSpacerItem对象(空白间隔对象)
当窗口被拉伸时,布局中的行和列也会相应地进行调整。由于在第0行添加了QSpacerItem,它具有较大的可调整范围,
因此它会占据更多的可用空间,从而增加了第0行的上下间距。当窗口被拉伸时,布局中的行和列也会相应地进行调整。
由于在第0行添加了QSpacerItem,它具有较大的可调整范围,因此它会占据更多的可用空间,从而增加了第0行的上下间距。
'''
grid.addItem(spacer,0,0,1,1)
#在第1行第2列单元格处,添加按钮小部件,位置占1行1列(1个单元格空间)
grid.addWidget(QPushButton('第1行:第2列--1行1列'), 1, 2, 1, 1)
# 在第1行第3列单元格处,添加按钮小部件,位置占1行1列(1个单元格空间)
grid.addWidget(QPushButton('第1行:第3列--1行1列'), 1, 3, 1, 1)
# 在第2行第4列单元格处,添加文本框小部件,位置占2行2列(4个单元格空间)
grid.addWidget(QPlainTextEdit('第2行:第4列--2行2列'), 2, 4, 2, 2)
# 在第3行第2列单元格处,添加文本框小部件,位置占2行2列(4个单元格空间)
grid.addWidget(QPlainTextEdit('第3行:第2列--2行2列'), 3, 2, 2, 2)
# 在第5行第5列单元格处,添加按钮小部件,位置占1行1列(1个单元格空间)
grid.addWidget(QPushButton('第5行:第5列--1行1列'), 5, 5, 1, 1)
'''
在第6行第5列单元格处,添加了QSpacerItem对象(空白间隔对象)
设置了空白间隔的宽100像素,高100像素,这样第6行高度会比其它行高100个像素
设置了空白间隔的策略是QSizePolicy.Maximum,如果窗口拉伸特别大,第6行的上下的间距会随窗口拉伸而增加
'''
spacer2 = QSpacerItem(100, 100, QSizePolicy.Maximum)
grid.addItem(spacer2, 6, 5, 1, 2)
# 在第7行第6列单元格处,添加按钮小部件,位置占1行1列(1个单元格空间)
grid.addWidget(QPushButton('第7行:第6列--1行1列'), 7, 6, 1, 1)
# 创建一个水平布局对象
hlayout = QHBoxLayout()
# 在水平布局对象中添加两个按钮控件对象,实现水平布局
hlayout.addWidget(QPushButton('水平布局-按钮1'))
hlayout.addWidget(QPushButton('水平布局-按钮2'))
# 把水平布局对象添加到网格布局对象中,起始位置在第7行第1列处,占1行2列空间
grid.addLayout(hlayout, 7, 1, 1, 2)
# 网格对象的第2列和第5列分别设置拉伸因子stretch=1,这样这两列区别与其它列,当窗口拉伸,这两列会拉伸
grid.setColumnStretch(2, 1)
grid.setColumnStretch(5, 1)
# 设置网格布局的第0列的最小宽度为80像素
grid.setColumnMinimumWidth(0, 80)
if __name__ == "__main__":
app = QApplication(sys.argv)
demo = GridLayoutDemo()
demo.show()
sys.exit(app.exec())