本页内容

QGraphicsAnchorLayout Class

QGraphicsAnchorLayout 类提供了一种布局,可用于在 Graphics View 中将小部件锚定在一起。更多内容...

头文件: #include <QGraphicsAnchorLayout>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承自: QGraphicsLayout

公共函数

QGraphicsAnchorLayout(QGraphicsLayoutItem *parent = nullptr)
virtual ~QGraphicsAnchorLayout()
QGraphicsAnchor *addAnchor(QGraphicsLayoutItem *firstItem, Qt::AnchorPoint firstEdge, QGraphicsLayoutItem *secondItem, Qt::AnchorPoint secondEdge)
void addAnchors(QGraphicsLayoutItem *firstItem, QGraphicsLayoutItem *secondItem, Qt::Orientations orientations = Qt::Horizontal | Qt::Vertical)
void addCornerAnchors(QGraphicsLayoutItem *firstItem, Qt::Corner firstCorner, QGraphicsLayoutItem *secondItem, Qt::Corner secondCorner)
QGraphicsAnchor *anchor(QGraphicsLayoutItem *firstItem, Qt::AnchorPoint firstEdge, QGraphicsLayoutItem *secondItem, Qt::AnchorPoint secondEdge)
qreal horizontalSpacing() const
void setHorizontalSpacing(qreal spacing)
void setSpacing(qreal spacing)
void setVerticalSpacing(qreal spacing)
qreal verticalSpacing() const

重新实现的公共函数

virtual int count() const override
virtual void invalidate() override
virtual QGraphicsLayoutItem *itemAt(int index) const override
virtual void removeAt(int index) override
virtual void setGeometry(const QRectF &geom) override

重新实现的受保护函数

virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override

详细说明

锚点布局允许开发人员指定控件应如何相对于彼此以及相对于布局本身进行放置。通过调用addAnchor()、addAnchors()或addCornerAnchors()向布局添加锚点来完成此配置。

可通过anchor() 函数访问布局中现有的锚点。被锚定的项目会自动添加到布局中;若移除项目,其所有锚点也将自动移除。

三个使用锚点布局将小部件对齐到小部件边缘的小部件

使用锚点布局对齐简单的彩色控件。

锚点始终设置在项的边缘之间,其中“中心”也被视为一条边缘。请看以下示例:

layout->addAnchor(b, Qt::AnchorLeft, a, Qt::AnchorRight);
layout->addAnchor(b, Qt::AnchorTop, a, Qt::AnchorBottom);

在此示例中,元素a 的右边缘锚定在元素b 的左边缘上,而元素a 的底部边缘锚定在元素b 的顶部边缘上,因此元素b 将被放置在元素b 的右下方。

与上文代码中分别调用两次addAnchor()相比,addCornerAnchors()函数提供了一种更简便的方式来锚定两个控件的角。下面我们将看到如何将一个控件锚定到其外围布局的左上角:

layout->addCornerAnchors(a, Qt::TopLeftCorner, layout, Qt::TopLeftCorner);

当使用锚点来匹配控件的宽度或高度时,使用addAnchors() 函数非常方便。与其他用于指定锚点的函数一样,它也可以用于将控件锚定到布局上。

锚点布局中的尺寸提示和尺寸策略

QGraphicsAnchorLayout 会尊重每个项的大小提示和大小策略。请注意,QSizePolicy 的某些属性属于not respected 。

锚点布局中的间距

布局可能会在项目之间分配一些间距。如果未显式指定间距,实际间距通常为 0。

但是,如果第一个小部件的边缘与第二个小部件的边缘方向相反(例如,第一个小部件的右边缘锚定在第二个小部件的左边缘上),则会通过像素度量从样式中查询锚点的大小:水平锚点使用PM_LayoutHorizontalSpacing ,垂直锚点使用PM_LayoutVerticalSpacing 。

如果间距为负值,这些控件将在一定程度上重叠。

已知问题

目前 QGraphicsAnchorLayout 尚不支持某些功能。未来这一情况可能会发生变化,因此若想避免未来出现行为退化,请避免使用这些功能:

  • 拉伸因子不会被遵循。
  • QSizePolicy::ExpandFlag 未被正确处理。
  • “高度即宽度”规则未被遵循。

另请参阅 QGraphicsLinearLayout 、QGraphicsGridLayout 以及QGraphicsLayout 。

成员函数文档

QGraphicsAnchorLayout::QGraphicsAnchorLayout(QGraphicsLayoutItem *parent = nullptr)

创建一个 QGraphicsAnchorLayout 实例。parent 将作为参数传递给QGraphicsLayout 的构造函数。

[virtual noexcept] QGraphicsAnchorLayout::~QGraphicsAnchorLayout()

销毁QGraphicsAnchorLayout 对象。

QGraphicsAnchor *QGraphicsAnchorLayout::addAnchor(QGraphicsLayoutItem *firstItem, Qt::AnchorPoint firstEdge, QGraphicsLayoutItem *secondItem, Qt::AnchorPoint secondEdge)

在项目firstItem 的边firstEdge 与项目secondItem 的边secondEdge 之间创建一个锚点。锚点的间距由样式决定。位于布局边与项目边之间的锚点大小为 0。如果两条边之间已经存在锚点,则新锚点将替换旧锚点。

firstItem 如果secondItem 并非布局的一部分,则会自动添加到布局中。这意味着count() 的值最多可能增加 2。

锚点获得的间距取决于锚点的类型。例如,从一个项目的右边缘到另一个项目的左边缘(或反之)的锚点将使用默认的水平间距。从底部到顶部的锚点也遵循同样的行为(但它们将使用默认的垂直间距)。 对于所有其他锚点组合,间距将为 0。所有锚定函数均遵循此规则。

还可以通过调用 `QGraphicsAnchor::setSpacing()` 方法手动设置间距。

当调用此函数时,若firstItem 或secondItem 是布局的父元素,则会导致未定义的行为。

另请参阅 addAnchors() 和addCornerAnchors()。

void QGraphicsAnchorLayout::addAnchors(QGraphicsLayoutItem *firstItem, QGraphicsLayoutItem *secondItem, Qt::Orientations orientations = Qt::Horizontal | Qt::Vertical)

将firstItem 的两个或四个边与secondItem 的相应边锚定,使得firstItem 在orientations 指定的维度下与secondItem 具有相同的大小。

例如,以下示例将两个元素的左侧和右侧边缘锚定,使其宽度保持一致:

layout->addAnchor(b, Qt::AnchorLeft, c, Qt::AnchorLeft);
layout->addAnchor(b, Qt::AnchorRight, c, Qt::AnchorRight);

也可以通过以下代码行实现:

layout->addAnchors(b, c, Qt::Horizontal);

另请参阅 addAnchor() 和addCornerAnchors()。

void QGraphicsAnchorLayout::addCornerAnchors(QGraphicsLayoutItem *firstItem, Qt::Corner firstCorner, QGraphicsLayoutItem *secondItem, Qt::Corner secondCorner)

在firstItem 和secondItem 之间,根据指定角点firstCorner 和secondCorner 创建两个锚点,其中一个用于水平边,另一个用于垂直边。

这是一个便捷函数,因为锚定角点可以表示为锚定两条边。例如:

layout->addAnchor(a, Qt::AnchorTop, layout, Qt::AnchorTop);
layout->addAnchor(a, Qt::AnchorLeft, layout, Qt::AnchorLeft);

也可以通过以下代码行实现:

layout->addCornerAnchors(a, Qt::TopLeftCorner, layout, Qt::TopLeftCorner);

如果边缘对之间已经存在锚点,则该锚点将被本函数指定的锚点所替换。

firstItem 如果secondItem 尚未包含在布局中,则会自动添加到布局中。这意味着count() 的值最多会增加 2。

另请参阅 addAnchor() 和addAnchors()。

QGraphicsAnchor *QGraphicsAnchorLayout::anchor(QGraphicsLayoutItem *firstItem, Qt::AnchorPoint firstEdge, QGraphicsLayoutItem *secondItem, Qt::AnchorPoint secondEdge)

返回位于以下锚点之间对应的锚点:firstItem 、firstEdge 、secondItem 和secondEdge 。如果不存在该锚点,该函数将返回 0。

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

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

qreal QGraphicsAnchorLayout::horizontalSpacing() const

返回锚点布局的默认水平间距。

另请参阅 verticalSpacing() 和setHorizontalSpacing()。

[override virtual] void QGraphicsAnchorLayout::invalidate()

重写了:QGraphicsLayout::invalidate()。

[override virtual] QGraphicsLayoutItem *QGraphicsAnchorLayout::itemAt(int index) const

重新实现了:QGraphicsLayout::itemAt(int i) const。

[override virtual] void QGraphicsAnchorLayout::removeAt(int index)

重写了:QGraphicsLayout::removeAt(int index)。

移除位于 `index ` 处的布局项,但不销毁该项。该项的所有权将转移给调用者。

移除项目时,与其关联的所有锚点也将一并移除。

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

[override virtual] void QGraphicsAnchorLayout::setGeometry(const QRectF &geom)

重写了:QGraphicsLayoutItem::setGeometry (const QRectF &rect)。

void QGraphicsAnchorLayout::setHorizontalSpacing(qreal spacing)

将锚点布局的默认水平间距设置为spacing 。

另请参阅 horizontalSpacing()、setVerticalSpacing() 和setSpacing()。

void QGraphicsAnchorLayout::setSpacing(qreal spacing)

将锚点布局的默认水平间距和默认垂直间距设置为spacing 。

如果某项内容采用锚点布局,但该锚点未关联任何间距,则将使用默认间距。

QGraphicsAnchorLayout 不支持负间距。设置负值将清除之前的间距,并使布局使用当前小部件样式提供的间距。

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

void QGraphicsAnchorLayout::setVerticalSpacing(qreal spacing)

将锚点布局的默认垂直间距设置为spacing 。

另请参阅 verticalSpacing()、setHorizontalSpacing() 和setSpacing()。

[override virtual protected] QSizeF QGraphicsAnchorLayout::sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const

重写了:QGraphicsLayoutItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const。

qreal QGraphicsAnchorLayout::verticalSpacing() const

返回锚点布局的默认垂直间距。

另请参阅 horizontalSpacing() 和setVerticalSpacing()。

© 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.