2016-09-22 522 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 ; 
}