强制QGraphicsItem使用z值并忽略父子关系

7

我在使用QGraphicsItem类时遇到了问题。

有一个base_parent,base_part,part_1和part_2。base_parent是base_part的父项,part_1和part_2是base_part的子项。我想做的是以一种方式设置这些项的Z值,使得part_1和part_2在base_parent后面堆叠,而base_part在base_parent前面堆叠。因此,我实现了如下内容:

  base_part->setParentItem(base_parent);
  part_1->setParentItem(base_part);
  part_2->setParentItem(base_part);

起初,他们尝试使用setZValue()设置z值,但显然这并没有起作用。

base_parent->setZValue(0);
base_part->setZValue(1);
part_1->setZValue(-1);
part_2->setZValue(-2);

文档中提到:

项目的子项堆叠在父项之上

我放弃了,但后来看到另一个参数。

您可以调用setZValue()来显式地将项目堆叠在其他兄弟姐妹前面或后面。项目的默认Z值为0。具有相同Z值的项按插入顺序堆叠。

您可以调用stackBefore()来重新排列子项列表。这将直接修改插入顺序。

您可以设置ItemStacksBehindParent标志以使子项在其父项后堆叠。

因此,我尝试设置标志,但它将整个子项都堆叠在后面,即base_part,part_1和part_2都堆叠在base_parent后面。

之后我找到了另一个标志,ItemNegativeZStacksBehindParent

如果项目的z值为负,则该项会自动堆叠在其父项后面。此标志启用setZValue()切换ItemStacksBehindParent。此标志是在Qt 4.6中引入的。

所以我再次尝试:

  base_part->setFlag(QGraphicsItem::ItemNegativeZStacksBehindParent);
  part_1->setFlag(QGraphicsItem::ItemNegativeZStacksBehindParent);
  part_2->setFlag(QGraphicsItem::ItemNegativeZStacksBehindParent);

使用此标志将part_1和part_2堆叠在base_part后面,但它们仍然在base_parent前面堆叠。
我想知道是否有一种方法强制物品仅使用Z值并忽略父子关系。
坚持分层结构的主要原因是我想要动画基础部件,并且part_1和part_2必须沿着base_part移动,当然我知道如何解决这个问题,只需将part_1和part_2的父级设置为base_parent,就能获得所需的结果,但是我还需要动画part_1和part_2,这有点棘手。
1个回答

0

我认为目前在Qt中,没有办法使QGraphicsItem对象的z-order完全独立于父/子关系,如果您需要对z-order进行如此程度的控制,最好的选择是将所有内容设置为顶层,并通过QGraphicsItem::setTransform(...)自己管理父母和孩子。

基本上内置的父/子实现所做的主要事情,除了跟踪项目树之外,还将变换从父项向下传播到子项,但是您可以通过矩阵算术自己完成这个过程,因为QTransform在底层只是一个3x3矩阵。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接