2011-09-15 95 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; 
    } 
} 
相關問題