2011-11-21 22 views
1

我有一個主窗口,我在其中動態創建對象,因此在創建任何新屏幕之前,我必須先刪除最後一個屏幕中的所有對象。我用這一點,這是偉大的工作:如何刪除Qt窗口中的所有子項?

qDeleteAll(this->window->findChildren<QWidget*>()); 

但現在我有這個屏幕,有一些QGraphicsViewQGraphicsScene,和我做了他們的父母在主窗口爲好,現在我得到了一個崩潰的時候我嘗試刪除所有主窗口的子項。

所以我的問題基本上是如何避免這種崩潰?我怎樣才能輕鬆安全地刪除我所有主窗口的孩子,包括GraphicsSceneGraphicsView

回答

5

我懷疑你的崩潰是由雙重刪除造成的。

QObject的父/子關係使得如果父項被刪除,它的子項也被刪除。所以如果你想刪除一個小部件及其所有後代,那麼你所需要做的就是刪除父項。

在你的情況下,我可能會確保所有動態創建的小部件屬於某種容器小部件/框架並刪除,然後重新創建它。

+0

你的意思是'後裔'?不知道是否需要刪除Qt小部件。它們是參考計數的,所以如果您重複使用一個或多個,那麼保留它們的成本很低。 – casualcoder

+2

QObject將在刪除時刪除其子項,但QObject系統中沒有引用計數。程序員仍然需要確保內存管理得當,這使得它更容易。 – Chris

+0

這很好,我剛剛創建了一個QWidget作爲所有對象的父對象,並將主窗口作爲此新QWidget的父窗口,然後刪除它以刪除所有對象。 你們可以多談談這個記憶問題嗎?我應該做些什麼來保證我不會耗盡內存?我的程序運行在嵌入式系統中,所以內存管理非常重要!謝謝。 –

相關問題