QLayout Class
QLayout 类是几何图形管理器的基类。更多
Header: | #include <QLayout> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake: | QT += widgets |
继承: | QObject 和QLayoutItem |
继承于 |
公共类型
enum | SizeConstraint { SetDefaultConstraint, SetFixedSize, SetMinimumSize, SetMaximumSize, SetMinAndMaxSize, SetNoConstraint } |
属性
- sizeConstraint : SizeConstraint
- spacing : int
公共函数
QLayout(QWidget *parent = nullptr) | |
bool | activate() |
virtual void | addItem(QLayoutItem *item) = 0 |
void | addWidget(QWidget *w) |
QMargins | contentsMargins() const |
QRect | contentsRect() const |
virtual int | count() const = 0 |
void | getContentsMargins(int *left, int *top, int *right, int *bottom) const |
virtual int | indexOf(const QLayoutItem *layoutItem) const |
virtual int | indexOf(const QWidget *widget) const |
bool | isEnabled() const |
virtual QLayoutItem * | itemAt(int index) const = 0 |
QWidget * | menuBar() const |
QWidget * | parentWidget() const |
void | removeItem(QLayoutItem *item) |
void | removeWidget(QWidget *widget) |
virtual QLayoutItem * | replaceWidget(QWidget *from, QWidget *to, Qt::FindChildOptions options = Qt::FindChildrenRecursively) |
bool | setAlignment(QWidget *w, Qt::Alignment alignment) |
bool | setAlignment(QLayout *l, Qt::Alignment alignment) |
void | setContentsMargins(const QMargins &margins) |
void | setContentsMargins(int left, int top, int right, int bottom) |
void | setEnabled(bool enable) |
void | setMenuBar(QWidget *widget) |
void | setSizeConstraint(QLayout::SizeConstraint) |
virtual void | setSpacing(int) |
QLayout::SizeConstraint | sizeConstraint() const |
virtual int | spacing() const |
virtual QLayoutItem * | takeAt(int index) = 0 |
(since 6.1) void | unsetContentsMargins() |
void | update() |
重新实现的公共函数
virtual QSizePolicy::ControlTypes | controlTypes() const override |
virtual Qt::Orientations | expandingDirections() const override |
virtual QRect | geometry() const override |
virtual void | invalidate() override |
virtual bool | isEmpty() const override |
virtual QLayout * | layout() override |
virtual QSize | maximumSize() const override |
virtual QSize | minimumSize() const override |
virtual void | setGeometry(const QRect &r) override |
静态公共成员
QSize | closestAcceptableSize(const QWidget *widget, const QSize &size) |
受保护函数
void | addChildLayout(QLayout *childLayout) |
void | addChildWidget(QWidget *w) |
QRect | alignmentRect(const QRect &r) const |
重新实现的受保护函数
virtual void | childEvent(QChildEvent *e) override |
详细说明
这是一个抽象基类,由具体类QBoxLayout,QGridLayout,QFormLayout, 和QStackedLayout 继承。
对于 QLayout 子类或QMainWindow 的用户来说,很少需要使用 QLayout 提供的基本函数,如setSizeConstraint() 或setMenuBar()。更多信息,请参阅布局管理。
要创建自己的布局管理器,请实现addItem(),sizeHint(),setGeometry(),itemAt() 和takeAt() 函数。您还应该实现minimumSize() 以确保在空间过小的情况下,您的布局不会被调整为零。要支持高度取决于宽度的子代,请执行hasHeightForWidth() 和heightForWidth()。有关实施自定义布局管理器的更多信息,请参阅Flow Layout示例。
删除布局管理器后,几何体管理将停止。
另请参阅 QLayoutItem 、布局管理、基本布局示例和流程布局示例。
成员类型文档
enum QLayout::SizeConstraint
可能的值有
常量 | 值 | 说明 |
---|---|---|
QLayout::SetDefaultConstraint | 0 | 主窗口小部件的最小尺寸设置为minimumSize() ,除非该窗口小部件已经有了最小尺寸。 |
QLayout::SetFixedSize | 3 | 主窗口小部件的大小设置为sizeHint() ;根本无法调整大小。 |
QLayout::SetMinimumSize | 2 | 主窗口小部件的最小尺寸设置为minimumSize() ;不能缩小。 |
QLayout::SetMaximumSize | 4 | 主窗口小部件的最大尺寸设置为maximumSize() ;不能变大。 |
QLayout::SetMinAndMaxSize | 5 | 主窗口部件的最小尺寸设置为minimumSize() ,最大尺寸设置为maximumSize() 。 |
QLayout::SetNoConstraint | 1 | Widget 不受约束。 |
另请参阅 setSizeConstraint()。
属性文档
sizeConstraint : SizeConstraint
该属性用于保存布局的大小调整模式
默认模式为SetDefaultConstraint 。
访问功能:
QLayout::SizeConstraint | sizeConstraint() const |
void | setSizeConstraint(QLayout::SizeConstraint) |
spacing : int
该属性用于保存布局内部件之间的间距。
如果没有显式设置值,布局的间距将从父布局或父部件的样式设置中继承。
对于QGridLayout 和QFormLayout ,可以使用setHorizontalSpacing() 和setVerticalSpacing() 设置不同的水平和垂直间距。在这种情况下,spacing() 返回-1。
访问函数:
virtual int | spacing() const |
virtual void | setSpacing(int) |
另请参阅 contentsRect()、getContentsMargins()、QStyle::layoutSpacing() 和QStyle::pixelMetric()。
成员函数文档
[explicit]
QLayout::QLayout(QWidget *parent = nullptr)
构造一个新的顶级 QLayout,父级为parent 。
该布局被直接设置为parent 的顶级布局。一个 widget 只能有一个顶级布局。它由QWidget::layout() 返回。
如果parent 是nullptr
,则必须将此布局插入另一个布局,或使用QWidget::setLayout() 将其设置为 widget 的布局。
另请参阅 QWidget::setLayout()。
bool QLayout::activate()
如有必要,重做parentWidget() 的布局。
一般情况下无需调用,因为它会在最合适的时候自动调用。如果布局已重做,则返回 true。
另请参阅 update() 和QWidget::updateGeometry()。
[protected]
void QLayout::addChildLayout(QLayout *childLayout)
子类中的addLayout()
或insertLayout()
函数会调用该函数,将布局childLayout 添加为子布局。
只有在实现支持嵌套布局的自定义布局时,才需要直接调用该函数。
另请参阅 QBoxLayout::addLayout()、QBoxLayout::insertLayout() 和QGridLayout::addLayout()。
[protected]
void QLayout::addChildWidget(QWidget *w)
子类中的addWidget()
函数会调用此函数,将w 添加为布局中的受管部件。
如果w 已由布局管理,则该函数将发出警告,并从布局中删除w 。因此,必须在将w 添加到布局的数据结构之前调用此函数。
[pure virtual]
void QLayout::addItem(QLayoutItem *item)
在子类中实现,以添加item 。如何添加取决于每个子类。
应用程序代码中通常不会调用该函数。要将部件添加到布局中,请使用addWidget() 函数;要添加子布局,请使用相关QLayout 子类提供的 addLayout() 函数。
注意: item 的所有权已转移到布局,删除它是布局的责任。
另请参阅 addWidget()、QBoxLayout::addLayout() 和QGridLayout::addLayout()。
void QLayout::addWidget(QWidget *w)
以该布局特有的方式将小部件w 添加到该布局中。此函数使用addItem().
[protected]
QRect QLayout::alignmentRect(const QRect &r) const
返回将此布局的几何图形设置为r 时应覆盖的矩形,前提是此布局支持setAlignment()。
结果由sizeHint() 和expandingDirections() 导出。它永远不会大于r 。
[override virtual protected]
void QLayout::childEvent(QChildEvent *e)
重实现:QObject::childEvent(QChildEvent *event).
[static]
QSize QLayout::closestAcceptableSize(const QWidget *widget, const QSize &size)
返回满足包括heightForWidth() 在内的所有widget 大小约束条件的大小,且尽可能接近size 。
QMargins QLayout::contentsMargins() const
返回布局周围使用的边距。
默认情况下,QLayout 使用样式提供的值。在大多数平台上,所有方向的边距都是 11 像素。
注: 属性 contentsMargins 的获取函数。
另请参阅 setContentsMargins()。
QRect QLayout::contentsRect() const
返回布局的geometry() 矩形,但要考虑内容边距。
另请参阅 setContentsMargins() 和getContentsMargins()。
[override virtual]
QSizePolicy::ControlTypes QLayout::controlTypes() const
重实现:QLayoutItem::controlTypes() const.
[pure virtual]
int QLayout::count() const
必须在子类中实现,以返回布局中的条目数。
另请参阅 itemAt().
[override virtual]
Qt::Orientations QLayout::expandingDirections() const
重实现:QLayoutItem::expandingDirections() 常量。
返回此布局是否可以使用比sizeHint() 更多的空间。Qt::Vertical 或Qt::Horizontal 表示只想在一个维度上增长,而Qt::Vertical |Qt::Horizontal 表示想在两个维度上增长。
默认实现返回Qt::Horizontal |Qt::Vertical 。子类将根据其子部件的size policies 重新实现,以返回一个有意义的值。
另请参阅 sizeHint().
[override virtual]
QRect QLayout::geometry() const
重实现:QLayoutItem::geometry() 常量。
另请参见 setGeometry().
void QLayout::getContentsMargins(int *left, int *top, int *right, int *bottom) const
对于left 、top 、right 和bottom 中的每一个,如果不是nullptr
,则存储指针所指位置的边距大小。
默认情况下,QLayout 使用样式提供的值。在大多数平台上,所有方向的边距都是 11 像素。
另请参阅 setContentsMargins(),QStyle::pixelMetric(),PM_LayoutLeftMargin,PM_LayoutTopMargin,PM_LayoutRightMargin, 和PM_LayoutBottomMargin 。
[virtual]
int QLayout::indexOf(const QLayoutItem *layoutItem) const
在此布局(不包括子布局)中搜索布局项layoutItem 。
返回layoutItem 的索引,如果未找到layoutItem ,则返回-1。
[virtual]
int QLayout::indexOf(const QWidget *widget) const
搜索此布局(不包括子布局)中的 widgetwidget 。
如果未找到widget ,则返回widget 的索引或-1。
默认实现使用itemAt() 遍历所有项目。
[override virtual]
void QLayout::invalidate()
重新实现:QLayoutItem::invalidate().
[override virtual]
bool QLayout::isEmpty() const
重实现:QLayoutItem::isEmpty() const.
bool QLayout::isEnabled() const
如果布局已启用,则返回true
;否则返回false
。
另请参阅 setEnabled() 。
[pure virtual]
QLayoutItem *QLayout::itemAt(int index) const
必须在子类中实现,以返回index 上的布局项。如果没有此类项目,函数必须返回nullptr
。项目从 0 开始连续编号,如果删除一个项目,其他项目将重新编号。
此函数可用于遍历布局。以下代码将为 widget 布局结构中的每个布局项绘制一个矩形。
static void paintLayout(QPainter *painter, QLayoutItem *item) { QLayout *layout = item->layout(); if (layout) { for (int i = 0; i < layout->count(); ++i) paintLayout(painter, layout->itemAt(i)); } painter->drawRect(item->geometry()); } void MyWidget::paintEvent(QPaintEvent *) { QPainter painter(this); if (layout()) paintLayout(&painter, layout()); }
[override virtual]
QLayout *QLayout::layout()
重新实现:QLayoutItem::layout().
[override virtual]
QSize QLayout::maximumSize() const
重实现:QLayoutItem::maximumSize() 常量。
返回此布局的最大尺寸。这是在遵守规范的前提下,布局所能达到的最大尺寸。
返回值不包括QWidget::setContentsMargins() 或menuBar() 所需的空间。
默认实现允许无限制地调整大小。
QWidget *QLayout::menuBar() const
返回为该布局设置的菜单栏,如果没有设置菜单栏,则返回nullptr
。
另请参阅 setMenuBar().
[override virtual]
QSize QLayout::minimumSize() const
重实现:QLayoutItem::minimumSize() 常量。
返回此布局的最小尺寸。这是在遵守规范的前提下,布局所能达到的最小尺寸。
返回值不包括QWidget::setContentsMargins() 或menuBar() 所需的空间。
默认实现允许无限制地调整大小。
QWidget *QLayout::parentWidget() const
返回此布局的父 widget,如果此布局未安装在任何 widget 上,则返回nullptr
。
如果布局是子布局,则此函数返回父布局的父 widget。
另请参阅 parent().
void QLayout::removeItem(QLayoutItem *item)
从布局中删除布局项item 。删除该项是调用者的责任。
请注意item 可以是一个布局(因为QLayout 继承于QLayoutItem )。
另请参阅 removeWidget() 和addItem()。
void QLayout::removeWidget(QWidget *widget)
从布局中移除部件widget 。调用此调用后,调用者有责任给该部件一个合理的几何形状,或将该部件放回布局中,或在必要时显式地将其隐藏。
注: widget 的所有权与添加时相同。
另请参阅 removeItem()、QWidget::setGeometry() 和addWidget()。
[virtual]
QLayoutItem *QLayout::replaceWidget(QWidget *from, QWidget *to, Qt::FindChildOptions options = Qt::FindChildrenRecursively)
搜索窗口小部件from ,如果找到,则用窗口小部件to 将其替换。如果成功,则返回包含 widgetfrom 的布局项。否则将返回nullptr
。如果options 包含Qt::FindChildrenRecursively
(默认),则会搜索子布局进行替换。options 中的任何其他标志都将被忽略。
请注意,返回的项目可能不属于该布局,而是属于某个子布局。
返回的布局项不再属于该布局,应删除或插入到其他布局中。部件from 不再由该布局管理,可能需要删除或隐藏。窗口小部件from 的父节点保持不变。
此函数适用于内置 Qt 布局,但可能不适用于自定义布局。
另请参阅 indexOf()。
bool QLayout::setAlignment(QWidget *w, Qt::Alignment alignment)
将部件w 的对齐方式设置为alignment ,如果在此布局(不包括子布局)中找到w ,则返回 true;否则返回false
。
bool QLayout::setAlignment(QLayout *l, Qt::Alignment alignment)
这是一个重载函数。
将布局l 的对齐方式设置为alignment ,如果在此布局(不包括子布局)中找到l ,则返回true
;否则返回false
。
void QLayout::setContentsMargins(const QMargins &margins)
设置布局周围使用的margins 。
默认情况下,QLayout 使用样式提供的值。在大多数平台上,所有方向的 margin 都是 11 像素。
注: 属性contentsMargins 的设置函数。
另请参阅 contentsMargins().
void QLayout::setContentsMargins(int left, int top, int right, int bottom)
设置left 、top 、right 和bottom 布局的边距。
默认情况下,QLayout 使用样式提供的值。在大多数平台上,所有方向的边距都是 11 像素。
注: 属性contentsMargins 的设置函数。
另请参阅 getContentsMargins(),QStyle::pixelMetric(),PM_LayoutLeftMargin,PM_LayoutTopMargin,PM_LayoutRightMargin, 和PM_LayoutBottomMargin 。
void QLayout::setEnabled(bool enable)
如果enable 为 true,则启用此布局,否则禁用它。
启用的布局会根据变化进行动态调整;禁用的布局就像不存在一样。
默认情况下,所有布局都是启用的。
另请参阅 isEnabled().
[override virtual]
void QLayout::setGeometry(const QRect &r)
重实现:QLayoutItem::setGeometry(const QRect &r).
另请参阅 geometry().
void QLayout::setMenuBar(QWidget *widget)
告诉几何管理器将菜单栏widget 放置在parentWidget() 的顶部、QWidget::contentsMargins() 的外部。所有子窗口小部件都放置在菜单栏底边的下方。
另请参阅 menuBar()。
[pure virtual]
QLayoutItem *QLayout::takeAt(int index)
必须在子类中实现,以便从布局中删除index 处的布局项,并返回该布局项。如果没有该项目,函数必须不执行任何操作并返回 0。项目从 0 开始连续编号,如果删除一个项目,其他项目将重新编号。
下面的代码片段展示了从布局中移除所有项目的安全方法:
QLayoutItem *child; while ((child = layout->takeAt(0)) != nullptr) { ... delete child->widget(); // delete the widget delete child; // delete the layout item }
[since 6.1]
void QLayout::unsetContentsMargins()
取消设置布局周围用户定义的边距。布局将使用样式提供的默认值。
注: 属性contentsMargins 的重置函数。
该函数在 Qt 6.1 中引入。
另请参阅 setContentsMargins().
void QLayout::update()
更新parentWidget() 的布局。
一般情况下无需调用,因为它会在最合适的时间自动调用。
另请参阅 activate() 和invalidate()。
© 2025 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.