我在使用
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 标志来堆叠子项 在它的父母身后。
所以我尝试设置
ItemStacksBehindParent
标志,但它移动了堆叠的整个孩子,这意味着 base_part、part_1 和 part_2 被堆叠在 base_parent 后面。
后来又发现了一个flag,
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 前面。
想知道有没有办法强制item只使用Z值,忽略父子关系。
坚持层次结构的主要原因是我想为base_part做动画并且part_1和part_2必须沿着base_part移动,当然我知道解决这个问题的方法,如果我只将part_1和part_2的parent设置为base_parent ,我将能够得到我想要的结果,但是我还必须为 part_1 和 part_2 设置动画,这有点讨厌。
我认为目前在 Qt 中没有办法使
QGraphicsItem
对象的 z 顺序完全独立于父/子关系,如果您需要将 z 顺序控制到这种程度,您最好的选择是一切都通过QGraphicsItem::setTransform(...)
自己管理父母和孩子
基本上,内置的父/子实现所做的主要事情是,除了跟踪项目树之外,它还将转换从父树传播到子树,但您可以通过矩阵运算自己完成此操作,如
QTransform
只是引擎盖下的 3x3 矩阵。