PySide6.QtWidgets.QGraphicsLayout¶
- class QGraphicsLayout¶
QGraphicsLayout
类为图形视图中的所有布局提供了基类。更多…继承者:
QGraphicsLinearLayout
,QGraphicsGridLayout
,QGraphicsAnchorLayout
概要¶
方法¶
def
__init__()
def
activate()
def
isActivated()
虚拟方法¶
def
count()
def
invalidate()
def
itemAt()
def
removeAt()
def
widgetEvent()
静态函数¶
注意
本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。
详细描述¶
QGraphicsLayout
是一个抽象类,它定义了一个虚拟API,用于为QGraphicsWidget
的子元素和其他QGraphicsLayoutItem
对象进行排列。QGraphicsWidget
通过setLayout()
将责任分配给QGraphicsLayout
。当小部件调整大小时,布局将自动排列小部件的子元素。QGraphicsLayout
继承自QGraphicsLayoutItem
,因此它可以由任何布局管理,包括其自己的子类。编写自定义布局¶
你可以使用
QGraphicsLayout
作为基础来编写你自己的自定义布局(例如,流式布局),但更常见的是使用它的一个子类——QGraphicsLinearLayout
或QGraphicsGridLayout
。在创建自定义布局时,至少必须重新实现以下函数:函数
描述
当布局的几何形状被设置时通知你。你可以在这个函数的重新实现中,将几何形状存储在你自己的布局类中。
返回布局的大小提示。
返回布局中的项目数量。
返回指向布局中某个项目的指针。
从布局中移除一个项目而不销毁它。
有关如何实现每个函数的更多详细信息,请参阅各个函数的文档。
每个布局都定义了自己的API来排列小部件和布局项。例如,使用网格布局时,您需要一个行和列的索引,以及可选的跨行和跨列、对齐、间距等。然而,线性布局只需要一个行或列的索引来定位其项。对于网格布局,插入顺序不会以任何方式影响布局,但对于线性布局,顺序至关重要。在编写自己的布局子类时,您可以自由选择最适合您布局的API。
QGraphicsLayout
提供了addChildLayoutItem()
便捷函数,用于将布局项添加到自定义布局中。如果需要,该函数将自动重新设置图形项的父项。激活布局¶
当布局的几何形状发生变化时,
QGraphicsLayout
会立即通过在每个项目上调用setGeometry()
来重新排列所有受管理的项目。这种重新排列被称为 激活 布局。QGraphicsLayout
更新其自身的几何形状以匹配其管理的QGraphicsLayoutItem
的contentsRect()
。因此,当窗口大小调整时,它将自动重新排列所有项目。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()
。另请参阅
- addChildLayoutItem(layoutItem)¶
- Parameters:
layoutItem –
QGraphicsLayoutItem
此函数是为自定义布局提供的便利函数,它将遍历布局中的所有项目,并将它们的图形项重新父级化到布局最近的
QGraphicsWidget
祖先。如果
layoutItem
已经在另一个布局中,它将被从该布局中移除。如果自定义布局想要特殊行为,它们可以选择不使用此函数,并实现自己的行为。
另请参阅
- abstract count()¶
- Return type:
整数
这个纯虚函数必须在
QGraphicsLayout
的子类中重新实现,以返回布局中的项目数量。子类可以自由决定如何存储项目。
另请参阅
- static instantInvalidatePropagation()¶
- Return type:
布尔
- invalidate()¶
清除布局中任何缓存的几何和大小提示信息,并向管理的父级
QGraphicsLayoutItem
发布一个LayoutRequest事件。另请参阅
- isActivated()¶
- Return type:
布尔
如果布局当前正在被激活,则返回
true
;否则返回false
。如果布局正在被激活,这意味着它当前正在重新排列其项目(即activate()
函数已被调用,并且尚未返回)。另请参阅
- abstract itemAt(i)¶
- Parameters:
i – 整数
- Return type:
这个纯虚函数必须在
QGraphicsLayout
的子类中重新实现,以返回索引i
处的项目指针。重新实现时可以假设i
是有效的(即,它遵循count()
的值)。与count()
一起,它被提供为遍历布局中所有项目的一种手段。子类可以自由决定如何存储项目,视觉排列不必通过此函数反映。
另请参阅
- abstract removeAt(index)¶
- Parameters:
索引 – int
这个纯虚函数必须在
QGraphicsLayout
的子类中重新实现,以移除位于index
处的项目。重新实现时可以假设index
是有效的(即,它遵循count()
的值)。实现必须确保被移除项的
parentLayoutItem()
不指向此布局,因为该项被视为已从布局层次结构中移除。如果布局要在应用程序之间重复使用,我们建议布局删除该项目,但图形视图框架不依赖于此。
子类可以自由决定如何存储项目。
- setContentsMargins(left, top, right, bottom)¶
- Parameters:
left – 浮点数
top – 浮点数
right – 浮点数
bottom – 浮点数
将内容边距设置为
left
、top
、right
和bottom
。顶级布局的默认内容边距取决于样式(通过查询PM_LayoutLeftMargin
、PM_LayoutTopMargin
、PM_LayoutRightMargin
和PM_LayoutBottomMargin
的像素度量)。对于子布局,默认边距为0。
更改内容边距会自动使布局无效。
另请参阅
- static setInstantInvalidatePropagation(enable)¶
- Parameters:
enable – 布尔值
此虚拟事件处理器接收托管小部件的所有事件。
QGraphicsLayout
使用此事件处理器来监听与布局相关的事件,例如几何变化、布局变化或布局方向变化。e
是指向事件的指针。您可以重新实现此事件处理程序,以跟踪您自定义布局的类似事件。
另请参阅
event()
sceneEvent()