QGraphicsLayout 类

QGraphicsLayout 类提供了图形视图布局的所有布局的基类。更多...

头文件 #include <QGraphicsLayout>
CMakefind_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmakeQT += widgets
继承了 QGraphicsLayoutItem
被以下类继承

QGraphicsAnchorLayoutQGraphicsGridLayoutQGraphicsLinearLayout

公开函数

QGraphicsLayout(QGraphicsLayoutItem *parent = nullptr)
虚拟~QGraphicsLayout()
voidactivate()
虚拟 intcount() const = 0
虚拟 voidinvalidate()
boolisActivated() const
虚拟 QGraphicsLayoutItem *itemAt(int i) const = 0
虚拟 voidremoveAt(int index) = 0
voidsetContentsMargins(qreal left, qreal top, qreal right, qreal bottom)
虚拟 voidwidgetEvent(QEvent *e)

重新实现的公有函数

虚拟 voidgetContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const override
虚拟 voidupdateGeometry() override

保护函数

voidaddChildLayoutItem(QGraphicsLayoutItem *layoutItem)

详细描述

QGraphicsLayout 是一个抽象类,定义了用于为 QGraphicsWidget 子项和其他 QGraphicsLayoutItem 对象进行布局的虚拟 API。QGraphicsWidget 通过 QGraphicsWidget::setLayout() 将责任分配给 QGraphicsLayout。当小部件大小变化时,布局将会自动排列小部件的子项。QGraphicsLayout 继承自 QGraphicsLayoutItem,因此它可以被任何布局管理,包括其自身的子类。

您可以使用QGraphicsLayout作为您自己的自定义布局(例如,流水布局)的基础,但更常见的做法是使用其子类之一 - QGraphicsLinearLayoutQGraphicsGridLayout。创建自定义布局时,以下函数必须作为基本实现重新实现:

函数描述
QGraphicsLayoutItem::setGeometry()通知您布局的几何形状已设置。您可以在该函数的重新实现中,将几何形状存储在您自己的布局类中。
QGraphicsLayoutItem::sizeHint()返回布局的大小提示。
QGraphicsLayout::count()返回布局中的项目数量。
QGraphicsLayout::itemAt()返回布局中的项目指针。
QGraphicsLayout::removeAt()从您的布局中移除一个项目,而不会销毁它。

有关如何实现每个函数的更详细信息,请参阅单独的函数文档。

每个布局定义了它自己的API来安排小部件和布局项目。例如,在网格布局中,您需要一个行和列索引,可选的行和列跨距、对齐方式、间距等。然而,线性布局只需要一个单行或列索引来定位其项目。对于网格布局,插入顺序不会以任何方式影响布局,但对于线性布局,顺序至关重要。在编写您自己的布局子类时,您可以自由选择最适合您的布局的API。

QGraphicsLayout提供了addChildLayoutItem()的便利函数,用于将布局项添加到自定义布局。如果需要,该函数将自动重新设置图形项的父项。

激活布局

当布局的几何形状更改时,QGraphicsLayout会通过调用每个项的setGeometry()来立即重新排列其所有管理的项。这种重新排列被称为激活布局。

QGraphicsLayout更新其自身的几何形状以匹配其管理的contentsRect()。因此,当小部件尺寸变化时,它会自动重新排列所有项。QGraphicsLayout缓存所有管理项的尺寸,以避免过多调用setGeometry()。

注意:QGraphicsLayout将具有与分配给它的小部件(而非布局)的contentsRect()相同的几何形状。

隐式激活布局

布局可以通过以下两种方式之一隐式激活:通过调用activate()或通过调用invalidate()。调用activate()会立即激活布局。相比之下,调用invalidate()是延迟的,因为它向管理的widget发布了一个LayoutRequest事件。由于事件压缩,activate()将在控制返回到事件循环后仅调用一次。这被称为使布局无效。使布局无效也将使缓存的所有信息无效。此外,invalidate()函数是一个虚函数。因此,您可以通过在QGraphicsLayout的子类中重新实现此函数来在子类中无效化您自己的缓存。

事件处理

QGraphicsLayout 监听管理中的小部件通过虚拟 widgetEvent() 事件处理器的事件。当布局分配给小部件时,所有发送到小部件的事件首先由 widgetEvent() 处理。这允许布局意识到小部件上任何相关的状态变化,例如可见性变化或布局方向变化。

边距处理

可以通过重新实现 setContentsMargins() 和 getContentsMargins() 来修改 QGraphicsLayout 的边距。

成员函数文档

QGraphicsLayout::QGraphicsLayout(QGraphicsLayoutItem *parent = nullptr)

构造一个 QGraphicsLayout 对象。

parent 被传递给QGraphicsLayoutItem 的构造函数,并将 QGraphicsLayoutItem 的 isLayout 参数设置为 true

如果 parentQGraphicsWidget,则布局将安装在该小部件上。(注意,安装布局将删除已安装的旧布局。)

[虚,noexcept] QGraphicsLayout::~QGraphicsLayout()

销毁 QGraphicsLayout 对象。

void QGraphicsLayout::activate()

激活布局,导致布局中的所有项立即重新排列。此函数基于调用 count() 和 itemAt(),然后按顺序对所有项目调用 setGeometry()。激活时,布局将调整其几何形状以匹配其父项的 contentsRect。然后父项将使任何自己的布局无效。

如果按顺序或递归调用,例如,通过响应调整大小而进行排列的小部件之一,此函数将不做任何事情。

请注意,布局可自由使用几何缓存来优化此过程。在调用 activate() 之前,您可以调用 invalidate() 强制使任何此类缓存无效。

另请参阅invalidate

[保护的] void QGraphicsLayout::addChildLayoutItem(QGraphicsLayoutItem *layoutItem)

此函数是提供给自定义布局的方便函数,将遍历布局中的所有项,并将它们的图形项目重新父子化到布局最近的上 QGraphicsWidget 祖先。

如果 layoutItem 已经在不同的布局中,它将从该布局中删除。

如果自定义布局想要特殊的行为,可以忽略使用此函数并实现自己的行为。

另请参阅graphicsItem

[纯虚] int QGraphicsLayout::count() const

必须在 QGraphicsLayout 的子类中重新实现此纯虚函数以返回布局中的项数。

子类可以自由决定如何存储项。

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

[重写虚函数] void QGraphicsLayout::getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const

重写:QGraphicsLayoutItem::getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const

[虚函数] void QGraphicsLayout::invalidate()

清除布局中的任何缓存的几何形状和尺寸提示信息,并向管理父 QGraphicsLayoutItem 发送 LayoutRequest 事件。

另请参阅 activate() 和 setGeometry()。

bool QGraphicsLayout::isActivated() const

如果布局目前正在激活中,返回 true;否则,返回 false。如果布局正在激活,这意味着它目前正在重新排列其项目(即,已调用 activate() 函数,并且尚未返回)。

另请参阅 activate() 和 invalidate()。

[纯虚函数] QGraphicsLayoutItem *QGraphicsLayout::itemAt(int i) const

该纯虚函数必须在 QGraphicsLayout 的子类中重写,以返回索引 i 的项目指针。重写可以假设 i 是有效的(即,它遵守 count()) 的值)。与 count() 一起,它作为一种遍历布局中所有项目的方法。

子类可以自行决定如何存储项目,并且视觉排列不需要通过此函数反映。

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

[纯虚函数] void QGraphicsLayout::removeAt(int index)

该纯虚函数必须在 QGraphicsLayout 的子类中重写,以删除索引 index 的项目。重写可以假设 index 是有效的(即,它遵守 count()) 的值)。

实现必须确保被删除的项目的前一个布局项不指向此布局,因为该项目被认为是从布局层次结构中删除的。

如果我们建议在应用程序之间重用布局,则建议布局删除项目,但图形视图框架不依赖于这一点。

子类可以自由决定如何存储项。

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

void QGraphicsLayout::setContentsMargins(qreal left, qreal top, qreal right, qreal bottom)

设置内容边距为 lefttoprightbottom。顶级布局的默认内容边距取决于样式(通过查询 QStyle::PM_LayoutLeftMarginQStyle::PM_LayoutTopMarginQStyle::PM_LayoutRightMarginQStyle::PM_LayoutBottomMargin 的像素度量)。

对于子布局,默认边距为 0。

更改内容边距将自动使布局无效。

另请参阅invalidate

[覆盖虚函数] void QGraphicsLayout::updateGeometry()

重新实现:QGraphicsLayoutItem::updateGeometry().

[虚函数] void QGraphicsLayout::widgetEvent(QEvent *e)

此虚拟事件处理程序接收所有管理小部件的事件。 QGraphicsLayout 使用此事件处理程序来监听与布局相关的事件,例如几何变化、布局变化或布局方向变化。

e 是事件的指针。

您可以重新实现此事件处理程序来跟踪您的自定义布局的类似事件。

另请参阅QGraphicsWidget::event() 和 QGraphicsItem::sceneEvent().

© 2024 The Qt Company Ltd. 本文档中的文档贡献是各自所有者的版权。本提供的文档是根据 Free Software Foundation 发布的 GNU 自由文档许可协议版本 1.3 许可的。Qt 和相关的标志是 The Qt Company Ltd 在芬兰及/或全球其他国家的商标。所有其他商标均为其各自所有者的财产。