簡體   English   中英

如何從QGraphicsScene中刪除所有QGraphicsItem

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM