2011-09-15 96 views
8

我已经从QGraphicsScene中编写了派生类。在我需要从场景中移除所有物品的时候,我希望物品被物理销毁(析构函数称为)。我尝试以下:如何从QGraphicsScene中删除所有QGraphicsItem

QList<QGraphicsItem*> all = items(); 
for (int i = 0; i < all.size(); i++) 
{ 
    QGraphicsItem *gi = all[i]; 
    removeItem(gi); 
    delete gi; // warning at this line 
} 

Qt创建者发出一个警告:警告:C4150:删除指针不完全型“的QGraphicsItem”的;没有析构函数叫

我不确定这是为什么。 QGraphicsItem有虚拟析构函数,所以应该从内存中删除项目。

如果这不是正确的方法,我该如何从QGraphicsScene删除所有QGraphicsItem?请注意,我知道场景何时被删除,所有项目也将被删除。但我想从场景中移除物品并画出其他物品。我希望删除的内容从内存中删除。

回答

7

你必须

#include <QGraphicsItem> 

在该文件中。否则,编译器不知道什么是QGraphicsItem,它具有虚拟析构函数等。

9

Like jpalecek指出,您缺少头文件。你应该接受他的回答。我只想指出两个潜在问题:

首先,你不需要拨打QGraphicsScene::removeItem()QGraphicsItem::~QGraphicsItem()是为你做的。其次,如果你把QGraphicsItem放在其他地方,请小心。也就是说,你有物品是其他物品的子物品。 QGraphicsItem的析构函数自动删除其所有子项。因此,当循环处理从QGraphicsScene返回的项目时,最终可能会删除已由其父项删除的子项目。例如,假设您有2个项目,A和B,B是A的子项。删除A时,B自动删除。然后你到达B并尝试删除它。繁荣!

一个更安全的方式做,这是测试如果该项目是顶级之一,即它没有父:

QList<QGraphicsItem*> all = items(); 
for (int i = 0; i < all.size(); i++) 
{ 
    QGraphicsItem *gi = all[i]; 
    if(gi->parentItem()==NULL) { 
     delete gi; 
    } 
} 
相关问题