我使用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设置动画,这有点令人讨厌。