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

时间:2016-07-28 11:35:19

标签: c++ qt qgraphicsview qgraphicsitem qgraphicsscene

我使用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);

documentation中有人说:

  

项目的子项堆叠在父项

之上

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

  

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

     

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

     

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

所以我尝试设置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值并忽略父子关系。

坚持分层结构的主要原因是我想要为base_part设置动画,part_1和part_2必须沿着base_part移动。当然我知道绕过这个问题的方法,如果我只设置part_1和part_2的父级到base_parent,我将能够得到我想要的结果,但是我必须为part_1和part_2设置动画,这有点令人讨厌。

0 个答案:

没有答案