本页内容

QGridLayout Class

QGridLayout 类将小部件以网格形式排列。更多内容...

标题: #include <QGridLayout>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承自: QLayout

属性

公共函数

QGridLayout(QWidget *parent = nullptr)
virtual ~QGridLayout()
void addItem(QLayoutItem *item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt::Alignment alignment = Qt::Alignment())
void addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = Qt::Alignment())
void addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
void addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())
void addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
QRect cellRect(int row, int column) const
int columnCount() const
int columnMinimumWidth(int column) const
int columnStretch(int column) const
void getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan) const
int horizontalSpacing() const
QLayoutItem *itemAtPosition(int row, int column) const
Qt::Corner originCorner() const
int rowCount() const
int rowMinimumHeight(int row) const
int rowStretch(int row) const
void setColumnMinimumWidth(int column, int minSize)
void setColumnStretch(int column, int stretch)
void setHorizontalSpacing(int spacing)
void setOriginCorner(Qt::Corner corner)
void setRowMinimumHeight(int row, int minSize)
void setRowStretch(int row, int stretch)
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

详细说明

QGridLayout 会占用分配给它的空间(由其父布局或通过 `parentWidget()` 函数分配),将其划分为行和列,并将它管理的每个小部件放入正确的单元格中。

列和行的行为完全相同;本文将讨论列,但行也有相应的函数。

每列都有一个最小宽度和一个拉伸因子。最小宽度是使用setColumnMinimumWidth() 设置的值与该列中每个小部件的最小宽度中的最大值。拉伸因子通过setColumnStretch() 设置,它决定了该列在满足必要最小宽度要求之外,还能获得多少可用空间。

通常,每个受管理的控件或布局都会通过addWidget()被放置到各自的单元格中。此外,控件还可以通过addItem()和addWidget()的跨行和跨列重载方法来占据多个单元格。 如果这样做,QGridLayout 将根据拉伸因子推测如何在列/行之间分配大小。

要将小部件从布局中移除,请调用removeWidget()。对小部件调用QWidget::hide() 也会将其从布局中移除,直到调用QWidget::show() 为止。

下图展示了一个包含五列三行网格的对话框片段(网格以洋红色叠加显示):

网格布局

该对话框片段中的第 0、2 和 4 列分别由一个QLabel 、一个QLineEdit 和一个 QListBox 组成。第 1 和 3 列是使用setColumnMinimumWidth() 创建的占位符。第 0 行由三个QLabel 对象组成,第 1 行由三个QLineEdit 对象组成,第 2 行由三个 QListBox 对象组成。 我们使用了占位符列(第 1 和第 3 列)来确保各列之间有适当的空间。

请注意,各列和各行的宽度和高度并不相等。若要使两列具有相同的宽度,必须手动将它们的最小宽度和拉伸因子设置为相同。可通过调用setColumnMinimumWidth()和setColumnStretch()来实现。

如果 QGridLayout 不是顶级布局(即不管理小部件的全部区域及其子项),则必须在创建它时将其添加到父布局中,但要在对其进行任何操作之前完成。添加布局的常规方法是在父布局上调用addLayout()。

添加布局后,即可使用addWidget()、addItem() 和addLayout() 将小部件和其他布局放入网格布局的单元格中。

QGridLayout 还包含两种边距宽度:contents margin 和spacing()。内容边距是指沿 QGridLayout 四边预留空间的宽度。spacing() 则是相邻框之间自动分配的间距宽度。

默认内容边距值由 `style` 提供。Qt 样式指定的默认值为:子控件为 9,窗口为 11。间距默认与顶级布局的边距宽度相同,或与父布局的边距宽度相同。

另请参阅 QBoxLayout 、QStackedLayout 、布局管理以及基本布局示例。

属性文档

horizontalSpacing : int

该属性控制并排布局的小部件之间的间距

如果未显式设置值,则布局的水平间距将继承自父布局,或继承自父控件的样式设置。

访问函数:

int horizontalSpacing() const
void setHorizontalSpacing(int spacing)

另请参阅 verticalSpacing 、QStyle::pixelMetric() 和PM_LayoutHorizontalSpacing 。

verticalSpacing : int

该属性控制了彼此重叠的控件之间的间距

如果未显式设置值,则布局的垂直间距将继承自父布局,或继承自父控件的样式设置。

访问函数:

int verticalSpacing() const
void setVerticalSpacing(int spacing)

另请参阅 horizontalSpacing 、QStyle::pixelMetric() 和PM_LayoutHorizontalSpacing 。

成员函数文档

[explicit] QGridLayout::QGridLayout(QWidget *parent = nullptr)

使用父控件parent 创建一个新的 QGridLayout。该布局初始时包含一行一列,并在插入新项目时自动扩展。

该布局被直接设置为parent 的顶级布局。一个控件只能有一个顶级布局。它由QWidget::layout()方法返回。

如果parent 是nullptr ,则必须将此网格布局插入到另一个布局中,或者使用QWidget::setLayout()将其设置为小部件的布局。

另请参阅 QWidget::setLayout()。

[virtual noexcept] QGridLayout::~QGridLayout()

破坏网格布局。如果这是一个顶级网格,则几何管理将被终止。

布局中的控件不会被销毁。

[override virtual protected] void QGridLayout::addItem(QLayoutItem *item)

重写了:QLayout::addItem(QLayoutItem *item)。

void QGridLayout::addItem(QLayoutItem *item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt::Alignment alignment = Qt::Alignment())

在位置row 、column 处添加item ,其尺寸为rowSpan 行和columnSpan 列,并根据alignment 进行对齐。如果rowSpan 和/或columnSpan 为 -1,则该项将分别延伸至底部和/或右侧边缘。该布局将接管item 的所有权。

警告:请 勿使用此函数添加子布局或子控件项。请改用addLayout() 或addWidget()。

void QGridLayout::addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = Qt::Alignment())

将layout 放置在网格的坐标位置 (row,column) 处。左上角坐标为 (0, 0)。

对齐方式由alignment 指定。默认对齐值为 0,这意味着该小部件将填满整个单元格。

非零对齐值表示布局不应扩展以填满可用空间,而应根据sizeHint()进行尺寸调整。

layout 成为网格布局的子控件。

void QGridLayout::addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())

此版本在单元格网格中新增了layout 布局,该布局横跨多行/多列。该单元格将从row 、column 开始,横跨rowSpan 行和columnSpan 列。

如果rowSpan 和/或columnSpan 为-1,则布局将分别延伸至底部和/或右侧边缘。

这是一个重载函数。

void QGridLayout::addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())

将给定的widget 添加到位于row 、column 的单元格网格中。默认情况下,左上角位置为(0, 0)。

对齐方式由alignment 指定。默认对齐方式为0,这意味着该控件将填满整个单元格。

void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())

此版本将给定的widget 添加到单元格网格中,并横跨多行/多列。该单元格将从fromRow 、fromColumn 开始,横跨rowSpan 行和columnSpan 列。widget 将具有给定的alignment 。

如果rowSpan 和/或columnSpan 的值为 -1,则控件将分别延伸至底部和/或右侧边缘。

这是一个重载函数。

QRect QGridLayout::cellRect(int row, int column) const

返回网格中行号为row 、列号为column 的单元格的几何信息。如果row 或column 位于网格之外,则返回一个无效的矩形。

警告:在 当前版本的 Qt中, 除非已调用setGeometry()(即在parentWidget() 可见之后),否则该函数不会返回有效结果。

int QGridLayout::columnCount() const

返回此网格中的列数。

int QGridLayout::columnMinimumWidth(int column) const

返回列column 的列间距。

另请参阅 setColumnMinimumWidth()。

int QGridLayout::columnStretch(int column) const

返回列column 的拉伸因子。

另请参阅 setColumnStretch()。

[override virtual] int QGridLayout::count() const

重新实现了:QLayout::count() const。

[override virtual] Qt::Orientations QGridLayout::expandingDirections() const

重新实现了:QLayout::expandingDirections() const。

void QGridLayout::getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan) const

返回具有给定index 的项目的位置信息。

作为row 和column 传递的变量将被更新为该项在布局中的位置,而rowSpan 和columnSpan 变量将被更新为该项的垂直和水平跨度。

另请参阅 itemAtPosition() 和itemAt()。

[override virtual] bool QGridLayout::hasHeightForWidth() const

重新实现了:QLayoutItem::hasHeightForWidth() const。

[override virtual] int QGridLayout::heightForWidth(int w) const

重新实现了:QLayoutItem::heightForWidth(int) const。

[override virtual] void QGridLayout::invalidate()

重写了:QLayout::invalidate()。

[override virtual] QLayoutItem *QGridLayout::itemAt(int index) const

重新实现了:QLayout::itemAt(int index) const。

QLayoutItem *QGridLayout::itemAtPosition(int row, int column) const

返回占据单元格 (row,column) 的布局项,如果单元格为空,则返回nullptr 。

另请参阅 getItemPosition() 和indexOf()。

[override virtual] QSize QGridLayout::maximumSize() const

重新实现了:QLayout::maximumSize() const。

[override virtual] int QGridLayout::minimumHeightForWidth(int w) const

重新实现了:QLayoutItem::minimumHeightForWidth(int w) const。

[override virtual] QSize QGridLayout::minimumSize() const

重新实现了:QLayout::minimumSize() const。

Qt::Corner QGridLayout::originCorner() const

返回用作网格原点的角点,即坐标 (0, 0) 所在的位置。

另请参阅 setOriginCorner()。

int QGridLayout::rowCount() const

返回此网格中的行数。

int QGridLayout::rowMinimumHeight(int row) const

返回行row 所设置的最小宽度。

另请参阅 setRowMinimumHeight()。

int QGridLayout::rowStretch(int row) const

返回行row 的拉伸因子。

另请参阅 setRowStretch()。

void QGridLayout::setColumnMinimumWidth(int column, int minSize)

将column 列的最小宽度设置为minSize 像素。

另请参阅 columnMinimumWidth() 和setRowMinimumHeight()。

void QGridLayout::setColumnStretch(int column, int stretch)

将列column 的拉伸因子设置为stretch 。第一列的编号为0。

伸缩因子是相对于该网格中其他列而言的。伸缩因子较高的列将占据更多的可用空间。

默认拉伸因子为 0。如果拉伸因子为 0,且该表中没有其他列能够扩展,则该列仍可能扩展。

另一种方法是使用 `addItem()` 并指定 `QSpacerItem` 来添加间距。

另请参阅 columnStretch() 和setRowStretch()。

[override virtual] void QGridLayout::setGeometry(const QRect &rect)

重新实现了:QLayout::setGeometry(const QRect &r)。

void QGridLayout::setOriginCorner(Qt::Corner corner)

将网格的原点(即位置 (0, 0))设置为corner 。

另请参阅 originCorner()。

void QGridLayout::setRowMinimumHeight(int row, int minSize)

将行row 的最小高度设置为minSize 像素。

另请参阅 rowMinimumHeight() 和setColumnMinimumWidth()。

void QGridLayout::setRowStretch(int row, int stretch)

将第row 行的拉伸因子设置为stretch 。第一行编号为0。

拉伸因子是相对于该网格中其他行而言的。拉伸因子较高的行将占据更多的可用空间。

默认拉伸因子为 0。如果拉伸因子为 0,且该表格中没有其他行能够扩展,则该行仍可能扩展。

另请参阅 rowStretch()、setRowMinimumHeight() 以及setColumnStretch()。

[override virtual] void QGridLayout::setSpacing(int spacing)

重新实现了属性QLayout::spacing 的访问函数。

该函数将垂直和水平间距均设置为spacing 。

另请参阅 spacing()、setVerticalSpacing() 和setHorizontalSpacing()。

[override virtual] QSize QGridLayout::sizeHint() const

重新实现了:QLayoutItem::sizeHint() const。

[override virtual] int QGridLayout::spacing() const

重新实现属性QLayout::spacing 的访问函数。

如果垂直间距等于水平间距,则该函数返回该值;否则返回 -1。

另请参阅 setSpacing()、verticalSpacing() 以及horizontalSpacing()。

[override virtual] QLayoutItem *QGridLayout::takeAt(int index)

重写了:QLayout::takeAt(int index)。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.