我在使用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,这有点棘手。