- 类QGraphicsLayout#
QGraphicsLayout
类为 Graphics View 中的所有布局提供基类。 更多…继承自:
QGraphicsLinearLayout
,QGraphicsGridLayout
,QGraphicsAnchorLayout
摘要#
方法#
def
__init__()
def
activate()
def
isActivated()
虚函数#
def
count()
def
invalidate()
def
itemAt()
定义
removeAt()
静态函数#
注意
本文档可能包含从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
会更新其自身的几何形状,以匹配其管理的contentsRect()
的QGraphicsLayoutItem
。因此,当小部件被调整大小时,它将自动重新排列所有项目。QGraphicsLayout
缓存其所有管理的项目的尺寸,以避免频繁调用setGeometry()
。注意
QGraphicsLayout
将与分配给它的小部件的(不是布局的)contentsRect()
的几何形状相同。隐式激活布局#
布局可以通过两种方式隐式激活:通过调用
activate()
或通过调用invalidate()
。调用activate()
将立即激活布局。相比之下,调用invalidate()
将被推迟,因为它是通过向管理的小部件发布一个 LayoutRequest 事件来实现的。由于事件压缩,activate()
只在控制返回到事件循环后调用一次。这被称为 使布局无效。使布局无效也会使任何缓存的详细信息无效。此外,invalidate()
是一个虚拟函数。因此,您可以通过重实现此函数来在一个QGraphicsLayout
的子类中使您自己的缓存无效。事件处理#
QGraphicsLayout
通过虚拟的widgetEvent()
事件处理器监听它所管理的小部件的事件。当布局分配给小部件时,所有发送到小部件的事件首先由widgetEvent()
处理。这允许布局了解小部件上的任何相关状态变化,例如可见性变化或布局方向变化。边距处理#
QGraphicsLayout
的边距可以通过重实现setContentsMargins()
和getContentsMargins()
来修改。- __init__([parent=None])#
- 参数:
parent –
QGraphicsLayoutItem
构建一个
QGraphicsLayout
对象。parent
被传递到QGraphicsLayoutItem
的构造函数中,并且QGraphicsLayoutItem
的 isLayout 参数被设置为 true。如果
parent
是一个QGraphicsWidget
,布局将被安装在这个小部件上。(注意,安装布局将删除已安装的旧布局。)- activate()#
激活布局,使布局中的所有项目立即重新排列。此功能基于调用
count()
和itemAt()
,然后逐个调用setGeometry()
。激活时,布局将调整其几何形状以匹配其父项的contentsRect()
。然后父项将无效化其任何布局。如果顺序或递归调用,例如,响应某个调整大小的排布项,则此函数将不执行任何操作。
注意,布局可以自由使用几何缓存来优化此过程。要强制无效化任何此类缓存,可以在调用 activate() 之前调用
invalidate()
。另请参阅
- addChildLayoutItem(layoutItem)#
- 参数:
layoutItem -
QGraphicsLayoutItem
此函数是针对自定义布局提供的便捷函数,将遍历布局中的所有项目并将它们的图形项目重新委派给布局的最近
QGraphicsWidget
祖先。如果
layoutItem
已经在不同的布局中,它将从这个布局中删除。如果自定义布局需要特殊行为,可以根据需要忽略此函数并实现自己的行为。
另请参阅
- 抽象count()#
- 返回类型:
int
这个纯虚拟函数必须在一个
QGraphicsLayout
的子类中重新实现,以返回布局中的项目数量。子类可以自由决定如何存储项目。
另请参阅
- static instantInvalidatePropagation()#
- 返回类型:
布尔型
- invalidate()#
清除布局中任何缓存的几何大小和大小提示信息,并向管理的父级
QGraphicsLayoutItem
发送一个LayoutRequest事件。另请参阅
- isActivated()#
- 返回类型:
布尔型
如果布局目前正在激活中,则返回
true
;否则返回false
。如果布局正在激活中,这意味着它目前正在重新排列其项目(即,已调用activate()
函数,并且尚未返回)。另请参阅
- abstract itemAt(i)#
- 参数:
i – 整数
- 返回类型:
这个纯虚拟函数必须在一个
QGraphicsLayout
的子类中重新实现,以返回索引i
处项目的指针。重新实现可以假定i
是有效的(即,它尊重count()
的值)。与count()
一起提供,作为遍历布局中所有项目的手段。子类可以自由决定如何存储项目,并且视觉排列不必通过此函数反映。
另请参阅
- 抽象removeAt(index)#
- 参数:
index - int
这个纯虚函数必须在《QGraphicsLayout》子类中重新实现,用于移除位于
index
的项目。重构可以实现假设index
是有效的(即,它尊重count()
的值)。实现必须确保被移除项目的
parentLayoutItem()
不指向此布局,因为该项目被认为已从布局层次结构中移除。如果布局要在应用程序之间重用,我们建议布局删除该项目,但图形视图框架并不依赖于此。
子类可以自由决定如何存储项目。
- setContentsMargins(left, top, right, bottom)#
- 参数:
left - float
top - float
right - float
bottom - float
设置内容边距为
left
,top
,right
和bottom
。顶级布局的默认内容边距取决于风格(通过查询PM_LayoutLeftMargin
,PM_LayoutTopMargin
,PM_LayoutRightMargin
和PM_LayoutBottomMargin
的像素度量)。对于子布局,默认边距为 0。
更改内容边距会自动使布局无效。
另请参阅
- 静态 setInstantInvalidatePropagation(enable)#
- 参数:
enable – 布尔值
此虚事件处理器接收管理小部件的所有事件。
QGraphicsLayout
使用此事件处理器来监听与布局相关的事件,例如几何变化、布局更改或布局方向更改。e
是事件的指针。您可以通过重写此事件处理器来跟踪您自定义布局的类似事件。
另请参阅
event()
sceneEvent()