PySide6.QtWidgets.QGraphicsLayout

class QGraphicsLayout

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

PySide6.QtWidgets.QGraphicsLayout 的继承图

继承者: QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsAnchorLayout

概要

方法

虚拟方法

静态函数

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。

详细描述

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

编写自定义布局

你可以使用QGraphicsLayout作为基础来编写你自己的自定义布局(例如,流式布局),但更常见的是使用它的一个子类——QGraphicsLinearLayoutQGraphicsGridLayout。在创建自定义布局时,至少必须重新实现以下函数:

函数

描述

setGeometry()

当布局的几何形状被设置时通知你。你可以在这个函数的重新实现中,将几何形状存储在你自己的布局类中。

sizeHint()

返回布局的大小提示。

count()

返回布局中的项目数量。

itemAt()

返回指向布局中某个项目的指针。

removeAt()

从布局中移除一个项目而不销毁它。

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

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

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

激活布局

当布局的几何形状发生变化时,QGraphicsLayout 会立即通过在每个项目上调用 setGeometry() 来重新排列所有受管理的项目。这种重新排列被称为 激活 布局。

QGraphicsLayout 更新其自身的几何形状以匹配其管理的 QGraphicsLayoutItemcontentsRect()。因此,当窗口大小调整时,它将自动重新排列所有项目。QGraphicsLayout 缓存所有其管理的项目的大小,以避免频繁调用 setGeometry()

注意

一个 QGraphicsLayout 将具有与其分配的小部件(而不是布局)的 contentsRect() 相同的几何形状。

隐式激活布局

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

事件处理

QGraphicsLayout 通过虚拟的 widgetEvent() 事件处理程序监听其管理的小部件的事件。当布局被分配给一个小部件时,所有传递给小部件的事件首先由 widgetEvent() 处理。这使得布局能够了解小部件上的任何相关状态变化,例如可见性变化或布局方向变化。

边距处理

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

__init__([parent=None])
Parameters:

父级QGraphicsLayoutItem

构造一个QGraphicsLayout对象。

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

如果 parent 是一个 QGraphicsWidget,布局将被安装在该小部件上。(请注意,安装新布局将删除已安装的旧布局。)

activate()

激活布局,导致布局中的所有项目立即重新排列。此函数基于调用count()itemAt(),然后依次对所有项目调用setGeometry()。激活时,布局将调整其几何形状以适应其父级的contentsRect()。然后,父级将使其自身的任何布局无效。

如果按顺序或递归调用,例如,由某个已排列的项目在响应调整大小时调用,此函数将不执行任何操作。

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

另请参阅

invalidate()

addChildLayoutItem(layoutItem)
Parameters:

layoutItemQGraphicsLayoutItem

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

如果 layoutItem 已经在另一个布局中,它将被从该布局中移除。

如果自定义布局想要特殊行为,它们可以选择不使用此函数,并实现自己的行为。

另请参阅

graphicsItem()

abstract count()
Return type:

整数

这个纯虚函数必须在QGraphicsLayout的子类中重新实现,以返回布局中的项目数量。

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

另请参阅

itemAt() removeAt()

static instantInvalidatePropagation()
Return type:

布尔

invalidate()

清除布局中任何缓存的几何和大小提示信息,并向管理的父级QGraphicsLayoutItem发布一个LayoutRequest事件。

另请参阅

activate() setGeometry()

isActivated()
Return type:

布尔

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

另请参阅

activate() invalidate()

abstract itemAt(i)
Parameters:

i – 整数

Return type:

QGraphicsLayoutItem

这个纯虚函数必须在QGraphicsLayout的子类中重新实现,以返回索引i处的项目指针。重新实现时可以假设i是有效的(即,它遵循count()的值)。与count()一起,它被提供为遍历布局中所有项目的一种手段。

子类可以自由决定如何存储项目,视觉排列不必通过此函数反映。

另请参阅

count() removeAt()

abstract removeAt(index)
Parameters:

索引 – int

这个纯虚函数必须在QGraphicsLayout的子类中重新实现,以移除位于index处的项目。重新实现时可以假设index是有效的(即,它遵循count()的值)。

实现必须确保被移除项的parentLayoutItem()不指向此布局,因为该项被视为已从布局层次结构中移除。

如果布局要在应用程序之间重复使用,我们建议布局删除该项目,但图形视图框架不依赖于此。

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

另请参阅

itemAt() count()

setContentsMargins(left, top, right, bottom)
Parameters:
  • left – 浮点数

  • top – 浮点数

  • right – 浮点数

  • bottom – 浮点数

将内容边距设置为lefttoprightbottom。顶级布局的默认内容边距取决于样式(通过查询PM_LayoutLeftMarginPM_LayoutTopMarginPM_LayoutRightMarginPM_LayoutBottomMargin的像素度量)。

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

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

另请参阅

invalidate()

static setInstantInvalidatePropagation(enable)
Parameters:

enable – 布尔值

widgetEvent(e)
Parameters:

eQEvent

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

e 是指向事件的指针。

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

另请参阅

event() sceneEvent()