格栅布局QGridLayout
格栅布局QGridLayout(或称为网格布局)提供多行多列的布局位置,可以把控件或子布局放到这些布局节点上,也可以让一个控件或子布局占用多行多列的布局位置。
QGridLayout继承自QLayout。用QGridLayout类创建实例对象的方法如下所示,其中parent 是窗口或容器类控件。
from PySide6.QtWidgets import QGridLayout
QGridLayout(parent: Union[PySide6.QtWidgets.QWidget,NoneType]= None)-> None
QGridLayout官方描述
QGridLayout获取可用的空间 (通过其父布局或parentWidget() ),将其分为行和列,并将其管理的每个widget放入正确的单元格中。
列和行的行为相同; 我们将讨论列,但是行有等效的功能。
每列都有一个最小宽度和一个拉伸因子。最小宽度是使用setColumnMinimumWidth() 和该列中每个小部件的最小宽度的最大集合。使用setColumnStretch() 设置拉伸因子,并确定该列将超过其所需最小值的可用空间。
通常,使用addWidget() 将每个托管的小部件或布局放入其自己的单元格中。使用addItem() 和addWidget() 的行和列跨越重载,小部件也有可能占用多个单元格。如果这样做,QGridLayout将猜测如何在列/行上分配大小 (基于拉伸因子)。
要从布局中删除小部件,请调用removeWidget()。在小部件上调用hide() 也有效地将小部件从布局中删除,直到调用show()。
此图显示了带有五列三行网格的对话框的片段 (该网格以洋红色覆盖):
此对话框片段中的第0、2和4列由QLabel,QLineEdit和QListBox组成。第1列和第3列是用setColumnMinimumWidth() 制作的占位符。第0行由三个QLabel对象、三个qlinedit对象的第1行和三个QListBox对象的第2行组成。我们使用占位符列 (1和3) 来获得列之间的适量空间。
请注意,列和行的宽度或高度不相等。如果希望两列具有相同的宽度,则必须自己将其最小宽度和拉伸系数设置为相同。您可以使用setColumnMinimumWidth() 和setColumnStretch() 执行此操作。
如果QGridLayout不是顶级布局 (即不管理小部件的所有区域和子代),则必须在创建它时将其添加到其父布局中,但在对其进行任何操作之前。添加布局的正常方法是在父布局上调用addLayout()。
添加布局后,您可以使用addWidget(),addItem() 和addLayout() 开始将小部件和其他布局放入网格布局的单元格中。
QGridLayout还包括两个边距宽度: 内容边距和间距 ()。内容边距是沿QGridLayout的四个侧面的保留空间的宽度。间距 () 是相邻框之间自动分配的间距的宽度。
默认内容边距值由样式提供。默认的Qt styles指定的子小部件为9,windows为11。间距默认为与顶级布局的边距宽度相同,或与父布局相同。
格栅布局QGridLayout 的常用方法
格栅布局QGridLayout 的常用方法如表所示,主要方法介绍如下
- 添加添加控件和子布局控件
- 用addWidget(QWidget)方法可以在格栅布局第1列的末尾添加控件;
- 用addWidget(QWidget,row,column[,Qt.Alignment])方法和 addLayout(QLayout,row,column[,Qt.Alignment])方法可以在指定行和指定列添加控件和子布局,同时可选是否指定控件的对齐方式;
- 用addWidget(QWidget,row,column,rowspan,column_span[,Qt.Alignment])方法和addLayout(row,column,row_span,column_span[,Qt.Alignment])方法可以在指定行和指定列处添加控件和子布局控件和子布局可以跨多行多列。
- 缩放系数
- 用setRowStretch(row,stretch)方法和 setColumnStretch(column,stretch)方法可以设置行和列的相对缩放系数。
- 行列间距
- 用setHorizontalSpacing(int)和 setVerticalSpacing(int)方法可以分别设置行之间的距离和列之间的距离
- 用setSpacing(int)方法可以同时设置行列之间的距离
QGridLayout 的方法及参数类型 | 说 明 |
---|---|
addItem(arg__1: PySide6.QtWidgets.QLayoutItem) addItem(item: PySide6.QtWidgets.QLayoutItem, row: int, column: int, rowSpan: int = 1, columnSpan: int = 1, alignment: PySide6.QtCore.Qt.AlignmentFlag = Default(Qt.Alignment)) | 在位置行、列、跨越行跨度行和列跨度列处添加项目,并根据对齐方式对其进行对齐。如果rowSpan和/或columnSpan为-1,则该项目将分别延伸到底部和/或右边缘。布局取得项目的所有权。 |
addWidget(arg__1: PySide6.QtWidgets.QWidget, row: int, column: int, alignment: PySide6.QtCore.Qt.AlignmentFlag = Default(Qt.Alignment)) addWidget(arg__1: PySide6.QtWidgets.QWidget, row: int, column: int, rowSpan: int, columnSpan: int, alignment: PySide6.QtCore.Qt.AlignmentFlag = Default(Qt.Alignment)) addWidget(w: PySide6.QtWidgets.QWidget)` | 将给定的小部件添加到行,列的单元格网格。默认情况下,左上角的位置为 (0,0)。对齐方式由对齐方式指定。默认对齐方式为0,这意味着小部件会填充整个单元格。 这是一个重载函数。此版本将给定的小部件添加到单元格网格,跨越多行/列。单元格将从fromRow,fromColumn跨越rowSpan行和columnSpan列开始。小部件将具有给定的对齐方式。如果rowSpan和/或columnSpan为-1,则小部件将分别延伸到底部和/或右边缘。 在末尾添加组件 |
addLayout(arg__1: PySide6.QtWidgets.QLayout, row: int, column: int, alignment: PySide6.QtCore.Qt.AlignmentFlag = Default(Qt.Alignment)) addLayout(arg__1: PySide6.QtWidgets.QLayout, row: int, column: int, rowSpan: int, columnSpan: int, alignment: PySide6.QtCore.Qt.AlignmentFlag = Default(Qt.Alignment)) | 将布局放在网格中的位置 (行,列)。左上角的位置是 (0,0)。 对齐方式由对齐方式指定。默认对齐方式为0,这意味着小部件会填充整个单元格。 非零对齐表示布局不应增长以填充可用空间,而应根据sizeHint() 进行大小调整。 布局成为网格布局的子项。 这是一个重载函数。 此版本将布局布局添加到单元格网格中,跨越多行/列。单元格将从行开始,列跨越rowSpan行和columnSpan列。 如果rowSpan和/或columnSpan为-1,则布局将分别延伸到底部和/或右边缘。 |
setRowStretch(row:int,stretch;int) | 设置行的伸缩系数 将row row的拉伸因子设置为拉伸。第一行是数字0。 拉伸因子相对于此网格中的其他行。拉伸系数较高的行占用了更多的可用空间。 默认拉伸因子为0。如果拉伸因子为0,并且此表中的其他行完全无法增长,则该行仍可能增长。 |
setColumnStretch(column:int, stretch:int) | 设置列的伸缩系数 将柱的拉伸因子设置为拉伸。第一列是数字0。 拉伸因子相对于此网格中的其他列。拉伸系数较高的列占用了更多的可用空间。 默认拉伸因子为0。如果拉伸因子为0,并且此表中的其他列根本无法增长,则该列可能仍会增长。 另一种方法是使用addItem() 与QSpacerItem添加间距。 |
setHorizontalSpacing(spacing:int) | 设置控件的水平间距 |
setVerticalSpacing(spacing:int) | 设置控件的竖直间距 |
setSpacing(spacing:int) | 设置控件的水平和竖直间距 |
rowCount() | 返回此网格中的行数。 |
columnCount() | 返回此网格中的列数 |
setRowMinimumHeight(row:int, minSize:int) | 将行行的最小高度设置为最小大小像素。 |
setColumnMinimumWidth(column:int,minSize: int) | 将列列的最小宽度设置为最小像素。 |
setGeomelry(QRect) | 设置格栅布局的位置和尺寸 |
setContentsMargins(left:int,top:int,right: int,bottom:int) setContentsMargins(margins: QMargins) | 设置布局内的控件与边框的页边距 |
setSizeConstraint(QLayout.SizeConstraint) | 设置控件随窗口尺寸改变时的变化方式 |
cellRect(row:int,column:int) | 获取单元格的矩形区域 QRect |
格栅布局QGridLayout例子
import sys
from PySide6.QtWidgets import QApplication,QWidget,QGridLayout,QPushButton,QSpacerItem,QSizePolicy,QHBoxLayout,QLineEdit,QPlainTextEdit
class GridLayoutDemo(QWidget):
def __init__(self,parent=None):
super(GridLayoutDemo,self).__init__(parent)
grid = QGridLayout()
self.setLayout(grid)
# 添加行列标识
for i in range(1,8):
rowEdit = QLineEdit('row%d'%(i))
rowEdit.setReadOnly(True)
grid.addWidget(rowEdit,i,0)
colEdit = QLineEdit('col%d'%(i))
colEdit.setReadOnly(True)
grid.addWidget(colEdit,0,i)
col_rol_Edit = QLineEdit('rol0_col0')
col_rol_Edit.setReadOnly(True)
grid.addWidget(col_rol_Edit,0,0,1,1)
# 开始表演
spacer = QSpacerItem(100,70,QSizePolicy.Maximum)
grid.addItem(spacer,0,0,1,1)
grid.addWidget(QPushButton('row1_col2_1_1'),1,2,1,1)
grid.addWidget(QPushButton('row1_col3_1_1'),1,3,1,1)
grid.addWidget(QPlainTextEdit('row2_col4_2_2'),2,4,2,2)
grid.addWidget(QPlainTextEdit('row3_col2_2_2'),3,2,2,2)
grid.addWidget(QPushButton('row5_col5_1_1'),5,5,1,1)
spacer2 = QSpacerItem(100,100,QSizePolicy.Maximum)
grid.addItem(spacer2,6,5,1,2)
grid.addWidget(QPushButton('row7_col6_1_1'),7,6,1,1)
hlayout = QHBoxLayout()
hlayout.addWidget(QPushButton('button_h1'))
hlayout.addWidget(QPushButton('button_h2'))
grid.addLayout(hlayout,7,1,1,2)
grid.setColumnStretch(5,1)
grid.setColumnStretch(2,1)
grid.setColumnMinimumWidth(0,80)
self.move(300,150)
self.setWindowTitle('QGridLayout例子')
if __name__ =="__main__":
app = QApplication(sys.argv)
demo = GridLayoutDemo()
demo.show()
sys.exit(app.exec())