更改QGraphicsScene插入顺序而不重新加载

时间:2016-09-30 23:44:23

标签: qt

我正在使用QGraphicsScene / QGraphicsView作为基础的图形形状编辑器。我对场景/视图框架有很多经验并且理解得很好。我遇到的问题是QGraphicsScene :: items总是以插入顺序(升序或降序)返回项目,无论Z顺序还是使用QGraphicsItem :: stackBefore调用。

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

我发现这样做的唯一方法是我必须从场景中删除项目并将其重新插入所需的堆叠顺序。在这个特定的任务中,它是少量的项目,并且没有明显的延迟,但在相关的编辑器中,它可能有数千个。

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

问题:

  • 我是否忽略了管理场景中会影响QGraphicsItem :: items结果的其他任何技术?
  • 或者是否有其他方法可以遍历场景中的项目,这些项目将为我提供绘图顺序?

1 个答案:

答案 0 :(得分:2)

我可以确认QGraphicsScene::items()items(sortOrder)返回原始创建和堆叠顺序中的项目列表,这与文档完全不一致。

但是,我发现使用

QGraphicsScene::items( QGraphicsScene::itemsBoundingRect, Qt::IntersectsItemBoundingRect, sortOrder)我确实按照正确的绘图顺序获取了这些项目,因此此功能显然会将QGraphicsItem::stackBefore()的调用考虑在内。

我不使用z-order功能,因此我无法评论这种情况是否有效。