QWidget的父母的目的是什么?

What is the purpose of QWidget's parent?

本文关键字:是什么 父母 QWidget      更新时间:2023-10-16

如果我将任何小部件子类化,通常的模式是:

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框架中使用的内存管理策略的一部分。将QObject分配给父对象意味着子对象的所有权将转移到父对象。如果父级被删除,则其所有子级也将被删除。来自文档:

QObjects在对象树中组织自己。当您创建以另一个对象为父对象的QObject,该对象将自动将其自身添加到父级的子级()列表中。父母拥有所有权对象的;即,它将自动删除其析构函数。您可以按名称和可选类型查找对象使用findChild()或findChildren()。

这意味着您可以以任何您认为合理的方式组织小部件(只要您不引入内存泄漏)。然而,我认为将所有小部件分配到它们各自的容器是一种常见的做法(或者显式地,或者更好地,使用addWidget等方法)。

如果使用addWidget将小部件分配给QLayout,则小部件的所有权将转移到布局(而布局可能由另一个周围布局或主窗口拥有)。所以,是的,这个方法定义的关系包括上面描述的更一般的父子关系。

现在,一旦主窗口被破坏,基本上QObjects的整个树就会被删除,正如您所期望的那样。

因此,如果您将对象保留为"无父对象",则删除该对象是您自己的责任

GUI语义

正如Frank正确指出的那样,在某些情况下,QWidgets之间的父子关系对GUI框架也具有语义意义。这方面的一个例子是模态对话框,只要它们保持打开,就会阻止它们的父对象。