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

问题描述 投票:0回答:1

我在使用

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 设置动画,这有点讨厌。

c++ qt qgraphicsview qgraphicsitem qgraphicsscene
1个回答
0
投票

我认为目前在 Qt 中没有办法使

QGraphicsItem
对象的 z 顺序完全独立于父/子关系,如果您需要将 z 顺序控制到这种程度,您最好的选择是一切都通过
QGraphicsItem::setTransform(...)

自己管理父母和孩子

基本上,内置的父/子实现所做的主要事情是,除了跟踪项目树之外,它还将转换从父树传播到子树,但您可以通过矩阵运算自己完成此操作,如

 QTransform
只是引擎盖下的 3x3 矩阵。

© www.soinside.com 2019 - 2024. All rights reserved.