我在使用QGraphicsItem
类时遇到问题。
有一个 base_parent、base_part、part_1、part_2。base_parent 是 base_part 的父级。part_1 和 part_2 是 base_part 的子代。我想要做的是以part_1和part_2堆叠在base_parent后面和base_part堆叠在base_parent前面的方式设置这些项目的Z值。所以我实现的是这样的:
base_part->setParentItem(base_parent);
part_1->setParentItem(base_part);
part_2->setParentItem(base_part);
Run Code Online (Sandbox Code Playgroud)
起初尝试使用 setZValue() 设置 z 值,但显然它不起作用。
base_parent->setZValue(0);
base_part->setZValue(1);
part_1->setZValue(-1);
part_2->setZValue(-2);
Run Code Online (Sandbox Code Playgroud)
在文档中说:
项目的子项堆叠在父项的顶部
我放弃了,但后来我看到了另一个参数。
您可以在项目上调用 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);
Run Code Online (Sandbox Code Playgroud)
使用此标志将 part_1 和 part_2 堆叠在 base_part 后面,但它们仍然堆叠在 base_parent 前面。
我想知道是否有办法强制项目仅使用 Z …