QLayout 类

QLayout 类是几何管理器的基础类。 更多信息...

头文件 #include <QLayout>
CMakefind_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmakeQT += widgets
继承自 QObjectQLayoutItem
继承

QBoxLayout, QFormLayout, QGridLayout, 和 QStackedLayout

公共类型

枚举SizeConstraint { SetDefaultConstraint, SetFixedSize, SetMinimumSize, SetMaximumSize, SetMinAndMaxSize, SetNoConstraint }

属性

公共函数

QLayout(QWidget *parent = nullptr)
boolactivate()
virtual voidaddItem(QLayoutItem *item) = 0
voidaddWidget(QWidget *w)
QMarginscontentsMargins() const
QRectcontentsRect() const
virtual intcount() const = 0
voidgetContentsMargins(int *left, int *top, int *right, int *bottom) const
virtual intindexOf(const QWidget *widget) const
virtual intindexOf(const QLayoutItem *layoutItem) const
boolisEnabled() const
virtual QLayoutItem *itemAt(int index) const = 0
QWidget *menuBar() const
QWidget *parentWidget() const
voidremoveItem(QLayoutItem *item)
voidremoveWidget(QWidget *widget)
virtual QLayoutItem *replaceWidget(QWidget *from, QWidget *to, Qt::FindChildOptions options = Qt::FindChildrenRecursively)
boolsetAlignment(QWidget *w, Qt::Alignment alignment)
boolsetAlignment(QLayout *l, Qt::Alignment alignment)
voidsetContentsMargins(int left, int top, int right, int bottom)
voidsetContentsMargins(const QMargins &margins)
voidsetEnabled(bool enable)
voidsetMenuBar(QWidget *widget)
voidsetSizeConstraint(QLayout::SizeConstraint)
virtual voidsetSpacing(int)
QLayout::SizeConstraintsizeConstraint() const
virtual intspacing() const
virtual QLayoutItem *takeAt(int index) = 0
(自 6.1) voidunsetContentsMargins()
voidupdate()

重新实现的公共函数

虚 QSizePolicy::ControlTypescontrolTypes() const 重载
虚 Qt::OrientationsexpandingDirections() const 重载
虚 QRectgeometry() const 重载
virtual voidinvalidate() 重载
虚 boolisEmpty() const 重载
虚 QLayout *layout() 重载
虚 QSizemaximumSize() const 重载
虚 QSizeminimumSize() const 重载
virtual voidsetGeometry(const QRect &r) 重载

静态公共成员

QSizeclosestAcceptableSize(const QWidget *widget, const QSize &size)

保护函数

voidaddChildLayout(QLayout *childLayout)
voidaddChildWidget(QWidget *w)
QRectalignmentRect(const QRect &r) const

重新实现的保护函数

virtual voidchildEvent(QChildEvent *e) 重载

详细信息

这是继承了具体类 QBoxLayoutQGridLayoutQFormLayoutQStackedLayout 的一个抽象基类。

对于 QLayout 子类或 QMainWindow 的用户,很少需要使用 QLayout 提供的基本函数,如 setSizeConstraint() 或 setMenuBar()。有关更多信息,请参阅 布局管理

要创建自己的布局管理器,实现函数 addItem()、sizeHint()、setGeometry()、itemAt() 和 takeAt()。您还应该实现 minimumSize(),以确保在空间不足时布局不会被调整到零大小。要支持高度取决于宽度的子项,实现 hasHeightForWidth() 和 heightForWidth()。有关实现自定义布局管理器的更多信息,请参阅 Flow Layout 示例。

当布局管理器被删除时,几何管理将停止。

另请参阅 QLayoutItem布局管理基本布局示例Flow Layout 示例

成员类型文档

枚举 QLayout::SizeConstraint

可能的值有

常量描述
QLayout::SetDefaultConstraint0将主小部件的最小大小设置为 minimumSize(),除非小部件已经设置了最小大小。
QLayout::SetFixedSize3将主小部件的大小设置为 sizeHint();它不能被调整大小。
QLayout::SetMinimumSize2将主小部件的最小大小设置为 minimumSize();它不能更小。
QLayout::SetMaximumSize4将主小部件的最大大小设置为 maximumSize();它不能更大。
QLayout::SetMinAndMaxSize5将主小部件的最小大小设置为 minimumSize(),并将最大大小设置为 maximumSize()。
QLayout::SetNoConstraint1小部件没有约束。

另请参阅setSizeConstraint

属性文档

sizeConstraint : SizeConstraint

此属性保存布局的调整大小模式

默认模式是SetDefaultConstraint

访问函数

QLayout::SizeConstraintsizeConstraint() const
voidsetSizeConstraint(QLayout::SizeConstraint)

spacing : int

此属性保存布局内部小部件之间的间隔

如果没有显式设置值,则布局的间隔将从父布局继承,或从父小部件的样式设置继承。

对于QGridLayoutQFormLayout,可以使用 setHorizontalSpacing() 和 setVerticalSpacing() 设置不同的水平和垂直间隔。在这种情况下,spacing() 返回 -1。

访问函数

virtual intspacing() const
virtual voidsetSpacing(int)

另请参阅contentsRectgetContentsMarginsQStyle::layoutSpacingQStyle::pixelMetric

成员函数文档

[明确] QLayout::QLayout(QWidget *parent = nullptr)

构建一个新的顶级 QLayout,父级为 parent

布局将直接设置为 parent 的顶级布局。一个控件只能有一个顶级布局。它可以通过 QWidget::layout() 返回。

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

另请参阅QWidget::setLayout

bool QLayout::activate()

如果需要,对 parentWidget() 进行布局更改。

通常不需要调用此函数,因为它在大多数合适的时机会被自动调用。如果布局被重新构建则返回 true。

另请参阅updateQWidget::updateGeometry

[受保护的] void QLayout::addChildLayout(QLayout *childLayout)

此函数由子类中的 addLayout()insertLayout() 函数调用,用于添加 childLayout 作为子布局。

唯一需要直接调用此函数的场景是,如果你实现了一个支持嵌套布局的自定义布局。

另请参阅 QBoxLayout::addLayout(),QBoxLayout::insertLayout() 和 QGridLayout::addLayout()。

[protected] void QLayout::addChildWidget(QWidget *w)

此函数由子类中的 addWidget() 函数调用,用于添加 w 作为布局的管理 widgets。

如果 w 已经被布局管理,此函数将生成一个警告,并将 w 从该布局中删除。因此,必须在此将 w 添加到布局的数据结构之前调用此函数。

[pure virtual] void QLayout::addItem(QLayoutItem *item)

在子类中实现以添加 item。具体添加方式因子类而异。

通常在应用程序代码中不会调用此函数。要将 widget 添加到布局中,请使用 addWidget() 函数;要将子布局添加进去,请使用相应 QLayout 子类提供的 addLayout() 函数。

注意: item 的所有权将转移到布局,由布局负责删除它。

另请参阅 addWidget(),QBoxLayout::addLayout() 和 QGridLayout::addLayout()。

void QLayout::addWidget(QWidget *w)

以针对布局特定的方式将 widget 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)

返回一个满足 widget 上所有大小约束的尺寸,包括 heightForWidth(),并且尽可能接近 size

QMargins QLayout::contentsMargins() const

返回围绕布局使用的边距。

默认情况下,QLayout 使用样式提供的值。在大多数平台上,所有方向的边距都是 11 像素。

注意:属性 contentsMargins 的获取函数。

另请参阅:setContentsMargins()。

QRect QLayout::contentsRect() const

返回布局的 geometry() 矩形,但考虑到了内容边距。

另请参阅:setContentsMargins() 和 getContentsMargins()。

[重写虚函数] QSizePolicy::ControlTypes QLayout::controlTypes() const

重新实现了: QLayoutItem::controlTypes() const

[纯虚函数] int QLayout::count() const

必须在子类中实现,以返回布局中的项数。

另请参阅:itemAt()。

[重写虚函数] Qt::Orientations QLayout::expandingDirections() const

重新实现了: QLayoutItem::expandingDirections() const

返回此布局是否可以使用比 sizeHint() 多的空间。值为 Qt::VerticalQt::Horizontal 意味着它只想在单个维度上增长,而 Qt::Vertical | Qt::Horizontal 意味着它想在两个维度上增长。

默认实现返回 Qt::Horizontal | Qt::Vertical。子类会重新实现它,根据其子小部件的 size policies 返回一个有意义的值。

另请参阅:sizeHint()。

[重写虚函数] QRect QLayout::geometry() const

重新实现了: QLayoutItem::geometry() const

另请参阅:setGeometry()。

void QLayout::getContentsMargins(int *left, int *top, int *right, int *bottom) const

对于不是 nullptrlefttoprightbottom,将存储在指针所指位置命名的边距的大小。

默认情况下,QLayout 使用样式提供的值。在大多数平台上,所有方向的边距都是 11 像素。

另请参阅:setContentsMargins()、QStyle::pixelMetricPM_LayoutLeftMarginPM_LayoutTopMarginPM_LayoutRightMarginPM_LayoutBottomMargin

[虚函数] int QLayout::indexOf(const QWidget *widget) const

在本布局中(不包括子布局)搜索小部件 widget

返回 widget 的索引,如果未找到则返回 -1。

默认实现在所有项目上迭代使用 itemAt()。

[虚拟] int QLayout::indexOf(const QLayoutItem *layoutItem) const

在此布局中(不包括子布局)搜索布局项目 layoutItem

返回 layoutItem 的索引,如果 layoutItem 未找到,则返回 -1。

[重写虚拟] void QLayout::invalidate()

重新实现: QLayoutItem::invalidate().

[重写虚拟] bool QLayout::isEmpty() const

重新实现: QLayoutItem::isEmpty() const.

bool QLayout::isEnabled() const

如果布局启用,则返回 true;否则返回 false

另请参阅.setEnabled().

[纯虚函数] QLayoutItem *QLayout::itemAt(int index) const

必须在子类中实现此函数以返回索引处的布局项目。如果没有这样的项目,则函数必须返回 nullptr。项目按顺序编号,从0开始。如果删除了项目,其他项目将重新编号。

此函数可用于遍历布局。以下代码将画一个矩形,用于绘制小部件布局结构的每个布局项目。

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());
}

另请参阅count() 和 takeAt().

[重写虚拟] QLayout *QLayout::layout()

重新实现: QLayoutItem::layout().

[重写虚拟] QSize QLayout::maximumSize() const

重新实现: QLayoutItem::maximumSize() const.

返回此布局的最大尺寸。这是布局可以具有的最大尺寸,同时仍遵守规范。

返回的值不包含由 QWidget::setContentsMargins() 或 menuBar() 所需的空间。

默认实现允许无限缩放。

返回为该布局设置的菜单栏,如果没有设置菜单栏,则返回 nullptr

另请参阅setMenuBar().

[重写虚拟] QSize QLayout::minimumSize() const

重新实现: QLayoutItem::minimumSize() const.

返回此布局的最小尺寸。这是布局可以具有的最小尺寸,同时仍遵守规范。

返回的值不包含由 QWidget::setContentsMargins() 或 menuBar() 所需的空间。

默认实现允许无限缩放。

QWidget *QLayout::parentWidget() const

返回此布局的父小部件,如果没有将此布局安装在任何小部件上,则返回 nullptr

如果布局是子布局,此函数将返回父布局的父小部件。

另请参阅parent().

void QLayout::removeItem(QLayoutItem *item)

从布局中移除布局项 item。删除条目的责任在于调用者。

注意,item 可以是布局(因为 QLayout 继承自 QLayoutItem)。

另请参阅removeWidget() 和 addItem().

void QLayout::removeWidget(QWidget *widget)

从布局中移除小部件 widget。在此调用之后,调用者需要负责为小部件提供一个合理的几何形状或将小部件放回布局中,或者在必要时显式地隐藏它。

注意: widget 的所有权与它被添加时的所有权相同。

另请参阅removeItem(),QWidget::setGeometry() 和 addWidget().

[虚拟] QLayoutItem *QLayout::replaceWidget(QWidget *from, QWidget *to, Qt::FindChildOptions options = Qt::FindChildrenRecursively)

搜索小部件 from 并在找到的情况下用小部件 to 替换它。如果在成功中返回包含小部件 from 的布局项。否则返回 nullptr。如果 options 包含 Qt::FindChildrenRecursively(默认值),将搜索子布局进行替换。其他 options 中的任何标志都将被忽略。

注意,因此返回的项可能不属于此布局,但属于子布局。

返回的布局项不再受布局的所有权,应该删除或将其插入到另一个布局中。小部件 from 将不再由布局管理,可能需要删除或隐藏。小部件 from 的父级将被保留不变。

此函数适用于内置的 Qt 布局,但可能不适用于自定义布局。

另请参阅indexOf().

bool QLayout::setAlignment(QWidget *w, Qt::Alignment alignment)

将小部件 w 的对齐方式设置为 alignment 并返回 w 是否在此布局中找到(不包括子布局)。否则返回 false

bool QLayout::setAlignment(QLayout *l, Qt::Alignment alignment)

这是重载的函数。

将布局 l 的对齐方式设置为 alignment 并返回在(不包括子布局)的此布局中找到 l 是否返回 true。否则返回 false

void QLayout::setContentsMargins(int left, int top, int right, int bottom)

设置用于围绕布局的 lefttoprightbottom 外边距。

默认情况下,QLayout 使用样式提供的值。在大多数平台上,所有方向的边距都是 11 像素。

注意:属性 contentsMargins 的设置函数。

另请参阅:contentsMargins(),getContentsMargins(),QStyle::pixelMetric(),PM_LayoutLeftMarginPM_LayoutTopMarginPM_LayoutRightMarginPM_LayoutBottomMargin

void QLayout::setContentsMargins(const QMargins &margins)

设置用于布局周围的 margins

默认情况下,QLayout 使用样式提供的值。在大多数平台上,所有方向的边距都是 11 像素。

注意:属性 contentsMargins 的设置函数。

另请参阅:contentsMargins

void QLayout::setEnabled(bool enable)

如果 enable 为真,则启用此布局,否则禁用它。

启用的布局能动态地响应更改;禁用的布局就像不存在一样。

默认情况下,所有布局都是启用的。

另请参阅:isEnabled

[重写虚拟] void QLayout::setGeometry(const QRect &r)

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

另请参阅:geometry

void QLayout::setMenuBar(QWidget *widget)

指示几何管理器将菜单栏 widget 放置在父部件 parentWidget 的顶部,位于 QWidget::contentsMargins 之外。所有子部件都放置在菜单栏底部边缘下方。

另请参阅:menuBar

[纯虚拟] 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
}

另请参阅:itemAt() 和 count

[自 6.1 版起] void QLayout::unsetContentsMargins()

取消设置围绕布局的用户定义边距。布局将使用样式提供的默认值。

注意:属性 contentsMargins 的重置函数。

此函数自 Qt 6.1 版开始引入。

另请参阅:setContentsMargins()。

void QLayout::update()

更新 parentWidget 的布局。

通常不需要调用此函数,因为它在最适合的时间自动调用。

另请参阅:activate() 和 invalidate

© 2024 The Qt Company Ltd。本文件中所包含的文档贡献是各自所有者的版权。此处提供的文档是根据由自由软件基金会发布的GNU自由文档许可版本1.3的条款授权的。Qt及其相应商标是芬兰和/或其他国家/地区的The Qt Company Ltd的商标。所有其他商标均为其各自所有者的财产。