簡體   English   中英

QWidget的父母的目的是什么?

[英]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樹。

因此,如果您將對象保留為“無父對象”,則刪除它是您自己的責任。

GUI語義

正如Frank正確指出的那樣,在某些情況下, QWidgets之間的父子關系對GUI框架也具有語義意義。 這方面的一個例子是模態對話框,只要它們保持打開狀態就會阻止它們的父級。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM