[英]How to delete all QGraphicsItem from QGraphicsScene
我從QGraphicsScene
編寫了一個派生類。 在某一點上,我需要從場景中刪除所有項目,我希望物品被物理銷毀(析構函數被調用)。 我嘗試了以下方法:
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 Creator發出警告:警告:C4150:刪除指向不完整類型'QGraphicsItem'的指針; 沒有破壞者叫
我不知道為什么會這樣。 QGraphicsItem
具有虛擬析構函數,因此應該從內存中刪除項目。
如果這是不正確的做法,我怎么可以刪除所有QGraphicsItem
從s QGraphicsScene
? 請注意,我知道刪除場景后,所有項目也將被刪除。 但我想從場景中刪除項目並繪制其他項目。 我希望從內存中刪除已刪除的項目。
您可以使用QGraphicsScene :: clear()刪除和刪除所有項目。
就像jpalecek指出的那樣,你缺少頭文件。 你應該接受他的回答。 我只想指出兩個潛在的問題:
首先,您不需要調用QGraphicsScene::removeItem()
。 QGraphicsItem::~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;
}
}
你必須
#include <QGraphicsItem>
在那個文件中。 否則,編譯器不知道QGraphicsItem
是什么,它有一個虛擬析構函數等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.