QGridLayout类在网格中布置控件。
Header: | #include <QGridLayout> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake: | QT += widgets |
Inherits: | <<< QLayout |
【详细描述】
QGridLayout 将通过父布局 parent layout 或 parentWidget()提供给它的空间划分为行和列,并将其管理的每个控件放入对应的单元格。
行和列的行为相同且有等效的函数,这里我们只讨论列。
每列都有一个最小的宽度和一个拉伸系数。
最小宽度 是“使用setColumnMinimumWidth()设置集合中的最大宽度”以及“该列中每个控件的最小宽度值”的较大值 。
拉伸因子 以列为例,使用setColumnStretch()设置列拉伸,并确定列将获得多少可用空间,并超过其必要的最小值。
通常,每个控件widget或布局layout使用addWidget()放入自己的单元格中。一个控件也可以使用 addItem() 和addWidget() 跨越行和列以占用多个单元格。如果是这样,QGridLayout将基于拉伸系数来猜测如何在行列上分配大小。
removeWidget()用于从布局中删除控件。在控件上调用QWidget::hide()也会有效地从布局中删除控件,并能通过调用QWidget::show()重新显示。
下图对话框包含了一个5列3行的网格:
对话框切片中的第0、第2 和第4列各由一个QLabel,QLineEdit,QListBox组成。第 0 行由三个QLabel组成,第 1 行由三个QLineEdit组成,第 2 行由三个QListBox组成。
第1和第3 列是用setColumnMinimumWidth()构成的占位符来获得列之间的适当空间。
请注意:列和行的宽度或高度均不相等。如果希望两列具有相同的宽度,必须使用setColumnMinimumWidth() 和 setColumnStretch() 自行设置它们的最小宽度和拉伸系数。
如果QGridLayout不是顶级布局(即并不管理控件的所有区域和子项),则必须在创建它时将其添加到其父布局中。添加的一般做法是在父布局上调用addLayout() 。
布局添加后,就可以开始使用 addWidget(), addItem()和addLayout()将控件和其他布局放入网格布局的单元格中了。
QGridLayout 还包括两个边距宽度:内容边距contents margin和 spacing()。
内容边距 是沿着每个QGridLayout的四个边的保留空间的宽度。
spacing() 是相邻方框之间自动分配的间距的宽度。
默认内容边距值由style类提供。Qt styles指定的默认值为9px(子控件)和11px(窗口)。边距间距默认为与顶级布局的相同,或与父布局相同。
参见 QBoxLayout, QStackedLayout, Layout Management 和 Basic Layouts Example。
【属性】
-
horizontalSpacing : int
此属性保存并排布局的控件间距。如未显式设置,则布局的水平间距将从父布局或父构件的样式中继承。以下是访问函数:
int horizontalSpacing() const void setHorizontalSpacing(int spacing)
-
verticalSpacing : int
此属性保存垂直布局的控件间距。如果未显式设置,则布局的垂直间距将从父布局或父构件的样式设置继承。以下是访问函数:
int verticalSpacing() const void setVerticalSpacing(int spacing)
【公有函数】
QGridLayout(QWidget *parent = nullptr) | |
在父控件parent构造一个新的QGridLayout,该布局最初只有一行一列,在插入新项目时将展开。 布局会直接设置为parent的顶级布局。一个widget只能有一个顶级布局,它由QWidget::layout()返回。 如果parent = nullptr,则必须将此QGridLayout插入到另一个layout中,或使用QWidget::setLayout()将其设置为控件布局。 | |
virtual | ~QGridLayout() |
void | addItem(QLayoutItem *item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt::Alignment alignment = Qt::Alignment()) |
新item项在row、column位置添加,跨越rowSpan行、columnSpan列,如果rowSpan 或 columnSpan 值设为 -1,则该项将分别延伸到底部或右边缘。新建item从属于当前布局。 | |
void | addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = Qt::Alignment()) |
新layout放在网格的 (row, column)位置,左上角的位置是(0, 0),对齐方式由alignment 指定,默认为0,表示新layout将填充整个单元格。非零对齐方式表示布局不应增长以填满可用空间,而应根据sizeHint()调整大小。新layout是当前网格布局的子项。 | |
void | addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment()) |
此重载版本增加了跨越rowSpan行、columnSpan列参数,如果rowSpan 或 columnSpan 值设为 -1,则该项将分别延伸到底部或右边缘。其余同上。 | |
void | addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment()) |
将给定widget 添加到单元网格的row, column处。默认左上角位置为(0, 0) 。 对齐方式由 alignment 指定。默认对齐为 0,表示控件将填充整个单元格。 | |
void | addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment()) |
此重载版本将给定widget从fromColumn、fromColumn 开始添加,跨越rowSpan行和columnSpan列。其余同上。 | |
QRect | cellRect(int row, int column) const |
返回网格中row行和column列的单元格的几何形状。如果 row 或 column 位于网格之外,则返回无效的矩形。 | |
int | columnCount() const |
返回此网格中的列数。 | |
int | columnMinimumWidth(int column) const |
返回column列的列间距。 | |
int | columnStretch(int ) const |
返回column列的拉伸系数。 | |
void | getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan) const |
返回具有给定index项的位置。 作为row和column传递的变量将随着项在布局中的位置而更新,而rowSpan和columnSpan变量将随着项目的垂直和水平跨度而更新。 | |
int | horizontalSpacing() const |
返回并排控件的水平间距。 | |
QLayoutItem * | itemAtPosition(int row, int column) const |
返回布局中占用 (row, column) 单元格的项,或者如果单元格为空,则返回nullptr。 | |
Qt::Corner | originCorner() const |
返回用于网格原点的角,即位置(0, 0)。 | |
int | rowCount() const |
返回此网格中的行数。 | |
int | rowMinimumHeight(int row) const |
返回row行设置的最小宽度。 | |
int | rowStretch(int row) const |
返回row行的拉伸系数。 | |
void | setColumnMinimumWidth(int column, int minSize) |
将column列的最小宽度设置为minSize像素。 | |
void | setColumnStretch(int column, int stretch) |
将column列的拉伸系数设置为stretch。 拉伸系数是相对于此网格中的其他列的,拉伸系数较高的列占用更多的可用空间。 第一列拉伸系数是0。默认拉伸系数为 0。如果拉伸系数为 0,并且此表中的其他列无法增长,该列仍可能会增长。 另一种方法是使用 addItem() 添加QSpacerItem增加间距。 | |
void | setHorizontalSpacing(int spacing) |
设置并排控件的水平间距。 | |
void | setOriginCorner(Qt::Corner corner) |
将网格的原点角,即位置 (0, 0),设置为corner。 | |
void | setRowMinimumHeight(int row, int minSize) |
将row行的最小高度设置为minSize像素。 | |
void | setRowStretch(int row, int stretch) |
将row行的拉伸系数设为stretch。 拉伸系数是相对于此网格中的其他行的,拉伸系数较高的行占用更多可用空间。 第一行拉伸系数是0,默认拉伸系数为 0。如果拉伸系数为 0,并且此表中的其他行无法增长,该行仍可能会增长。 | |
void | setVerticalSpacing(int spacing) |
设置控件之间的垂直间距。 | |
int | verticalSpacing() const |
返回控件之间的垂直间距。 |
【重实现的公有函数】
virtual int | count() const override | 详见父类: |
virtual Qt::Orientations | expandingDirections() const override | |
virtual bool | hasHeightForWidth() const override | |
virtual int | heightForWidth(int w) const override | |
virtual void | invalidate() override | |
virtual QLayoutItem * | itemAt(int index) const override | |
virtual QSize | maximumSize() const override | |
virtual int | minimumHeightForWidth(int w) const override | |
virtual QSize | minimumSize() const override | |
virtual void | setGeometry(const QRect &rect) override | |
virtual void | setSpacing(int spacing) override | |
virtual QSize | sizeHint() const override | |
virtual int | spacing() const override | |
virtual QLayoutItem * | takeAt(int index) override |
【重新实现的受保护函数】
virtual void | addItem(QLayoutItem *item) override | 实际程序中不会用此函数添加项。通常添加控件用 addWidget() ,添加布局用addLayout()。 |