如果我使用delete
刪除QWidget
,它是否從GUI註銷自己,還是必須手動執行此操作?這種行爲是否合乎邏輯?QWidget是否在銷燬時從GUI中刪除它自己?
回答
當您在佈局或堆疊小部件上調用addWidget
時,小部件的所有權將轉移到佈局/堆疊小部件。所有這一切意味着如果佈局/堆疊小部件被刪除,那麼添加到它的所有小部件也會被刪除。
無論是誰擁有,刪除一個小工具完全可以使用。所有權只是一種清理對象層次結構內存的簡便方法。它決不會說擁有它的對象必須刪除它。如果是這種情況,那麼一旦你添加了所有的小部件,你將只能擺脫它們,或者根本沒有!
如果您不希望在佈局/堆疊小部件被刪除時刪除小部件,那麼您可以撥打removeWidget
。請注意,不清楚widget的所有權究竟在哪裏。一個簡單的測試應用。我剛纔寫道暗示removeWidget
甚至根本沒有將所有權從QStackedWidget
轉移!
所以,要回答你的問題,Qt會正確地從佈局/堆疊小部件中刪除小部件,如果你刪除它。此外,這是正確的方式來刪除小部件,如果它不再屬於佈局/堆疊小部件。
正如@CatPlusPlus指出的那樣,Qt使用所有權系統。因此,無論您將小部件添加到佈局還是小部件的佈局等等,加法器的所有權都會交給加法器/父級。這通常記錄在方法文檔中。例如,如果您查看QWidget :: addLayout(QLayout *)的文檔,它說Qwidget接受了QLayout的所有權。當你刪除父母時,它也會刪除它的所有孩子。 閱讀這篇文章的更多信息。
Object Trees and Ownership in Qt
這種方法是非常有用的,因爲在傳統的C++開發人員必須跟蹤堆中分配的內存每一位的。然而,這個所有權系統要求開發者跟蹤父母。
+1雖然這不直接回答問題(因爲問題被解釋爲是/否問題,但沒有答案),這個答案中的鏈接確實包含了答案:「當樹中的任何QObject被刪除時,如果對象有一個父對象,那麼析構對象就會自動從其父對象中移除。」所以+1這個答案。 – blwy10 2011-05-17 19:05:30
- 1. jQuery刪除是否也銷燬resizables/draggables?
- 2. 當指令被銷燬時,監聽器是否被刪除?
- 3. 使RSpec銷燬記錄而不是刪除它們
- 4. 線程被銷燬時,變量是否被銷燬?
- 5. Javascript(Dojo):在銷燬對象時是否刪除事件偵聽器
- 6. 是否刪除容器在GTK內存中的小部件中銷燬
- 7. 從它自己的虛擬方法中間接銷燬對象。它是一種確定的行爲嗎?
- 8. 從自己加入刪除
- 9. Qt; QWidget刪除和刪除。 setParent(NULL)是否必要?
- 10. 關閉時刪除QWidget
- 11. 如何在自己的回調中銷燬對象
- 12. 刪除/銷燬完成期貨asyncio Python
- 13. Laravel 5刪除與銷燬方法
- 14. 刪除/銷燬和編輯路由
- 15. 刪除銷燬所有情況後
- 16. 將自己的甜蜜時間銷燬的會話
- 17. 銷燬記錄實際上並沒有將它們刪除
- 18. 銷燬GtkBuilder是否銷燬所有創建的小部件?
- 19. Dojo:如何從NodeList中刪除/銷燬實際的節點
- 20. 如何在關閉窗口時刪除/銷燬商店extjs 4
- 21. 在tfs中銷燬時,歷史是否會被預先保存?
- 22. 如果我在C++類中聲明一個向量,它是否會被銷燬,然後類的instate被銷燬?
- 23. Cocos2d:UIImageView不會從glView中刪除自己
- 24. 從drupal 8中刪除jquery 2.2.4(它自己加載)
- 25. 用戶註銷時是否必須銷燬SESSION?
- 26. 銷燬/移除自舉轉盤
- 27. QGraphicsObject自動銷燬
- 28. 運行中刪除自己
- 29. 爲什麼刪除和銷燬方法不刪除模型 - laravel
- 30. 如何使qwidget知道另一個qwidget是否在它上面
「unregister」是什麼意思? – Troubadour 2011-05-17 18:04:05
當我想添加一個窗口小部件到一個窗口,我必須做一個'addWidget'調用。同樣,我可以通過'removeWidget'來從窗口中移除窗口部件。我想知道一個小部件是否在它被「刪除」時自動註冊的地方自動執行此操作。 – Pieter 2011-05-17 18:06:36
Qt使用所有權系統,如果他們擁有其他東西(父母將刪除它們),您不應該手動刪除小部件。 – 2011-05-17 18:10:39