2016-09-22 192 views
0

我想删除QGraphicsScene中的所有项目并删除它们。像这样,删除时发生崩溃QGraphicsItem

QGraphicsItem * item = NULL; 
foreach(item, scene->items()) 
{ 
    scene->removeItem(item); 
    delete item; 
} 

但是,它刚刚在运行此代码块并从循环中跳出后出现分段故障。在调试模式下,调试器跳转到汇编文件: enter image description here 出了什么问题?

+0

如果使用'item-> deleteLater()'而不是'delete item',它仍会崩溃吗? – TheDarkKnight

+0

@TheDarkKnight - 我敢肯定,这不是问题,因为所讨论的项目类型为“QGraphicsItem *”,“QGraphicsItem”不能从“QObject”继承。尽管如此,它肯定会造成内存损坏。 –

+1

我在一定程度上回顾了关于'deleteLater'的评论。如果显示的代码在事件处理程序的上下文中执行,并且一个或多个已删除的项目实际上是从'QGraphicsObject'派生的类型,那么'QObject :: deleteLater' *将适用于这些项目。否则,它们可能会被删除,但仍有待处理的事件另外,如果你删除/删除所有项目,为什么不简单地使用['QGraphicsScene :: clear'](http://doc.qt.io/qt-5/qgraphicsscene.html#clear) –

回答

0

如果您要删除场景中的所有项目,为什么不按照如下所示“清除”。 你有场景对象与你对。

scene-> clear();

按照文档: 无效QGraphicsScene ::明确()

移除并删除从场景中的所有项目,但除此之外,离开现场的状态不变。

此功能是在Qt 4.4中引入的。

0

该代码看起来不错,但我同意只使用QGraphicsScene :: clear更有意义;它确实做到了这一点,我的猜测是它更有效率。

如果你派生了你自己的QGraphicsItem对象,然后检查派生类中的析构函数以删除多个内存。你可能会困惑哪个对象拥有一个特定的指针,导致两个不同的项目释放相同的内存。

0

你使用指针,当你使用函数清除它调用女儿的析构函数,但与指针你必须销毁所有的指针。不要使用foreach,尝试一个简单的for循环,因为foreach使用迭代器,我认为迭代器在删除后无效。

for(int i=0; i < v.size(); ++i) 
{ 
    delete v[i]; 
    v[i] = nullptr ; 
}