[英]What is the purpose of QWidget's parent?
如果我將任何小部件子類化,通常的模式是:
ZTabWidget::ZTabWidget(QWidget *parent):QTabWidget(parent){
blah ... blah ...
}
通常的模式是:
WidgetB widgetb = new WidgetB(widgeta)
widgeta.addWidget(widgetb);
將所有我的小部件分配為MainWindow作為其各自的父級是否有任何危害 - 盡管遵循addWidget層次結構的路徑,大多數小部件都有另一個小部件作為addWidget父級:
WidgetB widgetb = new WidgetB(mainWindow)
widgeta.addWidget(widgetb);
我希望這樣做的原因是因為mainWindow保存了應用程序的所有主要項目,並且我可以讓我的任何子類窗口小部件引用這些項目。
事實上,我正在考慮一個代理小部件,它僅用於保存一些公共引用,並將該代理小部件用作我所有小部件的公共父級。 有什么問題嗎?
確切地說,為QWidget注冊父母有什么用? 父母甚至在內部使用?
addWidget父級必須與構造函數父級相同嗎?
你的問題實際上有兩個方面:
QWidgets
的樹狀組織(實際上是任何QObjects
)是Qt-Framework中使用的內存管理策略的一部分。 將QObject
分配給父級意味着將子對象的所有權傳輸到父對象。 如果刪除父項,則還會刪除其所有子項。 來自文檔 :
QObjects在對象樹中組織自己。 當您使用另一個對象作為父對象創建QObject時,該對象將自動將其自身添加到父對象的children()列表中。 父母取得對象的所有權; 即,它將自動刪除其析構函數中的子項。 您可以按名稱查找對象,也可以使用findChild()或findChildren()鍵入。
這意味着您可以以任何對您來說合理的方式組織您的小部件(只要您不引入內存泄漏)。 但是,我認為通常的做法是將所有小部件分配給各自的容器(顯式或更好,使用addWidget
方法)。
如果微件被分配到一個QLayout
使用addWidget
,則插件的所有權被轉移到布局(其又可能是由另一個周圍布局或主窗口擁有)。 所以,是的,這種方法定義的關系包括上面描述的更一般的父子關系。
現在,只要主窗口被破壞,基本上就會像你期望的那樣刪除整個QObjects
樹。
因此,如果您將對象保留為“無父對象”,則刪除它是您自己的責任。
正如Frank正確指出的那樣,在某些情況下, QWidgets
之間的父子關系對GUI框架也具有語義意義。 這方面的一個例子是模態對話框,只要它們保持打開狀態就會阻止它們的父級。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.