2011-05-17 83 views
8

如果我使用delete刪除QWidget,它是否從GUI註銷自己,還是必須手動執行此操作?這種行爲是否合乎邏輯?QWidget是否在銷燬時從GUI中刪除它自己?

+0

「unregister」是什麼意思? – Troubadour 2011-05-17 18:04:05

+0

當我想添加一個窗口小部件到一個窗口,我必須做一個'addWidget'調用。同樣,我可以通過'removeWidget'來從窗口中移除窗口部件。我想知道一個小部件是否在它被「刪除」時自動註冊的地方自動執行此操作。 – Pieter 2011-05-17 18:06:36

+2

Qt使用所有權系統,如果他們擁有其他東西(父母將刪除它們),您不應該手動刪除小部件。 – 2011-05-17 18:10:39

回答

12

當您在佈局或堆疊小部件上調用addWidget時,小部件的所有權將轉移到佈局/堆疊小部件。所有這一切意味着如果佈局/堆疊小部件被刪除,那麼添加到它的所有小部件也會被刪除。

無論是誰擁有,刪除一個小工具完全可以使用。所有權只是一種清理對象層次結構內存的簡便方法。它決不會說擁有它的對象必須刪除它。如果是這種情況,那麼一旦你添加了所有的小部件,你將只能擺脫它們,或者根本沒有!

如果您不希望在佈局/堆疊小部件被刪除時刪除小部件,那麼您可以撥打removeWidget。請注意,不清楚widget的所有權究竟在哪裏。一個簡單的測試應用。我剛纔寫道暗示removeWidget甚至根本沒有將所有權從QStackedWidget轉移!

所以,要回答你的問題,Qt會正確地從佈局/堆疊小部件中刪除小部件,如果你刪除它。此外,這是正確的方式來刪​​除小部件,如果它不再屬於佈局/堆疊小部件。

+0

「如果刪除它,Qt將正確地從佈局/堆疊小部件中移除小部件。「最後一個」它「是指小部件還是佈局? – Pieter 2011-05-17 20:28:59

+0

小部件,因爲這是你的問題。 – 2011-05-17 21:35:04

+0

只是檢查。:)謝謝大家! – Pieter 2011-05-18 11:34:09

7

正如@CatPlusPlus指出的那樣,Qt使用所有權系統。因此,無論您將小部件添加到佈局還是小部件的佈局等等,加法器的所有權都會交給加法器/父級。這通常記錄在方法文檔中。例如,如果您查看QWidget :: addLayout(QLayout *)的文檔,它說Qwidget接受了QLayout的所有權。當你刪除父母時,它也會刪除它的所有孩子。 閱讀這篇文章的更多信息。

Object Trees and Ownership in Qt

這種方法是非常有用的,因爲在傳統的C++開發人員必須跟蹤堆中分配的內存每一位的。然而,這個所有權系統要求開發者跟蹤父母。

+5

+1雖然這不直接回答問題(因爲問題被解釋爲是/否問題,但沒有答案),這個答案中的鏈接確實包含了答案:「當樹中的任何QObject被刪除時,如果對象有一個父對象,那麼析構對象就會自動從其父對象中移除。」所以+1這個答案。 – blwy10 2011-05-17 19:05:30

相關問題