QGraphicsLayout 类
QGraphicsLayout 类提供了图形视图布局的所有布局的基类。更多...
头文件 | #include <QGraphicsLayout> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake | QT += widgets |
继承了 | QGraphicsLayoutItem |
被以下类继承 | QGraphicsAnchorLayout、QGraphicsGridLayout 和 QGraphicsLinearLayout |
公开函数
QGraphicsLayout(QGraphicsLayoutItem *parent = nullptr) | |
虚拟 | ~QGraphicsLayout() |
void | activate() |
虚拟 int | count() const = 0 |
虚拟 void | invalidate() |
bool | isActivated() const |
虚拟 QGraphicsLayoutItem * | itemAt(int i) const = 0 |
虚拟 void | removeAt(int index) = 0 |
void | setContentsMargins(qreal left, qreal top, qreal right, qreal bottom) |
虚拟 void | widgetEvent(QEvent *e) |
重新实现的公有函数
虚拟 void | getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const override |
虚拟 void | updateGeometry() override |
保护函数
void | addChildLayoutItem(QGraphicsLayoutItem *layoutItem) |
详细描述
QGraphicsLayout 是一个抽象类,定义了用于为 QGraphicsWidget 子项和其他 QGraphicsLayoutItem 对象进行布局的虚拟 API。QGraphicsWidget 通过 QGraphicsWidget::setLayout() 将责任分配给 QGraphicsLayout。当小部件大小变化时,布局将会自动排列小部件的子项。QGraphicsLayout 继承自 QGraphicsLayoutItem,因此它可以被任何布局管理,包括其自身的子类。
您可以使用QGraphicsLayout作为您自己的自定义布局(例如,流水布局)的基础,但更常见的做法是使用其子类之一 - QGraphicsLinearLayout 或 QGraphicsGridLayout。创建自定义布局时,以下函数必须作为基本实现重新实现:
函数 | 描述 |
---|---|
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。
如果 parent 是 QGraphicsWidget,则布局将安装在该小部件上。(注意,安装布局将删除已安装的旧布局。)
[虚,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 的子类中重新实现此纯虚函数以返回布局中的项数。
子类可以自由决定如何存储项。
[重写虚函数]
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() 一起,它作为一种遍历布局中所有项目的方法。
子类可以自行决定如何存储项目,并且视觉排列不需要通过此函数反映。
[纯虚函数]
void QGraphicsLayout::removeAt(int index)
该纯虚函数必须在 QGraphicsLayout 的子类中重写,以删除索引 index 的项目。重写可以假设 index 是有效的(即,它遵守 count()) 的值)。
实现必须确保被删除的项目的前一个布局项不指向此布局,因为该项目被认为是从布局层次结构中删除的。
如果我们建议在应用程序之间重用布局,则建议布局删除项目,但图形视图框架不依赖于这一点。
子类可以自由决定如何存储项。
void QGraphicsLayout::setContentsMargins(qreal left, qreal top, qreal right, qreal bottom)
设置内容边距为 left,top,right 和 bottom。顶级布局的默认内容边距取决于样式(通过查询 QStyle::PM_LayoutLeftMargin、QStyle::PM_LayoutTopMargin、QStyle::PM_LayoutRightMargin 和 QStyle::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 在芬兰及/或全球其他国家的商标。所有其他商标均为其各自所有者的财产。