正确地从QGraphicsScene / QgraphicsItemGroup / QGraphicsView中删除项目

时间:2014-07-23 12:14:49

标签: c++ qt qtgui

我试图制作一个带有可移动控制点的情节usig QGraphicsViewQGraphicsScene&& QGraphicsItemGroup。我遇到的问题是我无法找到删除/删除该项目的任何方法。

我的想法如下:

我将会有一个QGraphicsView,它将成为可移动的插值点,在它下面将绘制一个通过这些点的绘图。

为实现这一目标,我考虑使用两个(或更多)QGraphicsItemGroups。   - 一个用于插值点,由于我需要拖动它们而无法删除   - 一个显示在他们下面的实际情节

为此,我将把行添加到第一组并显示它们。但是会有很多重绘,我现在不知道的是如何从QGraphicsView / QGraphicsScene / QGraphicsItemGroup正确删除项目,以便赢得&# 39;不再显示了。请记住,我需要删除/替换一组项目而不删除所有其他项目。

我正在阅读文档和教程,但找不到任何有用的内容。

1 个答案:

答案 0 :(得分:4)

您需要先了解图形视图/场景系统。 例如,您声明以下内容: -

  

“我将有一个QGraphicsView,它就是......”

这没有意义。 QGraphicsView就像一个进入世界的窗口(QGraphicsScene)。因此,您将把项目放入场景中,这些项目来自QGraphicsItem或QGraphicsObject。这些是通过QGraphicsView查看的。

添加项目很简单,您只需调用QGraphicsScene函数addItem即可获取QGraphicsItem *。

在这种情况下,您有一个指向该项目的指针,因此如果您调用QGraphicsScene::removeItem,它将从场景中删除它,然后您可以删除该项目。如果删除是在插槽函数内发生的,我建议使用deleteLater调用,而不是直接删除指针。

您的问题提及QGraphicsItemGroups。如上所述,功能QGraphicsScene::createItemGroupQGraphicsScene::destroyItemGroup

正如destroyItemGroup的文档所述: -

  

将组中的所有项目重新分组到组的父项目,然后从场景中删除组,最后将其删除

因此,在这种情况下,调用destroyItemGroup只会破坏该组。因此,在调用destroyItemGroup之前,需要首先删除和删除项目。

请注意,如果您只是删除场景中的某个项目,它将自动删除。

最后,请注意Qt GraphicItems使用Qt的父层次结构,因此您可以简单地使用父对象,而不是使用项目组。