2016-09-30 17 views
1

我正在使用QGraphicsScene/QGraphicsView作为其基础的图形形状编辑器。我在场景/视图框架方面有很多经验,并且相当了解它。我遇到的问题是QGraphicsScene :: items始终以插入顺序(升序或降序)返回项目,无论Z顺序或使用QGraphicsItem :: stackBefore调用。更改QGraphicsScene Insertion Order Without Reloading

问题是,和大多数图形编辑器一样,我需要能够在堆叠顺序中向前或向后移动形状。最后,为了保存结果数据,我必须遍历场景中的项目列表,并以我使用的任何格式保存每个项目的数据。

我发现要做到这一点的唯一方法是我必须从场景中删除项目并将它们重新插入到所需的叠加顺序中。在这个特定的任务中,这是一小部分项目,发生时没有明显的延迟,但在相关的编辑器中,可能会有数千个。

虽然QGraphicsItem :: zValue和QGraphicsItem :: stackBefore允许我影响绘图顺序,但它们都不会改变从QGraphicsScene :: items返回的顺序。由于我最终保存的数据需要反映绘图顺序,因此我必须移除并重新插入以最终获得正确的顺序。

问题:

  • 恐怕是我忽略了这将影响的QGraphicsItem ::项目成果现场内管理项目的任何其他技术?
  • 或者还有另一种遍历场景中的项目的方法,它会给我绘图顺序吗?
+0

是不是'QGraphicsScene :: items()'做了什么? –

+0

不,正如我所说的,QGraphicsScene :: items总是以插入顺序返回。 QGraphicsItem :: stackBefore和QGraphicsItem :: setZValue所做的更改不会影响QGraphicsScene :: items。 – goug

+0

有趣的是,文件说它会这样做。 –

回答

2

我可以证实,QGraphicsScene::items()items(sortOrder)的独创和堆叠顺序,这并不在所有的文档同意回报的项目清单。

然而,我发现,通过使用

QGraphicsScene::items(QGraphicsScene::itemsBoundingRect, Qt::IntersectsItemBoundingRect, sortOrder)我得到的正确项目图纸顺序,所以这个功能显然需要调用QGraphicsItem::stackBefore()考虑。

我不使用z-order功能,所以我不能评论这是否适用于这种情况。

+0

谢谢 - 我将不得不运行一些测试来查看是否包含z顺序。欣赏答案。 – goug