QWidget的父母的目的是什么?

Ble*_*eek 9 c++ qt

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

ZTabWidget::ZTabWidget(QWidget *parent):QTabWidget(parent){
  blah ... blah ...
}
Run Code Online (Sandbox Code Playgroud)

通常的模式是:

WidgetB widgetb = new WidgetB(widgeta)
widgeta.addWidget(widgetb);
Run Code Online (Sandbox Code Playgroud)

将所有我的小部件分配为MainWindow作为其各自的父级是否有任何害处 - 尽管遵循addWidget层次结构的路径,大多数小部件都有另一个小部件作为addWidget父级:

WidgetB widgetb = new WidgetB(mainWindow)
widgeta.addWidget(widgetb);
Run Code Online (Sandbox Code Playgroud)

我希望这样做的原因是因为mainWindow保存了应用程序的所有主要项目,并且我可以让我的任何子类窗口小部件引用这些项目.

事实上,我正在考虑一个代理小部件,它仅用于保存一些公共引用,并将该代理小部件用作我所有小部件的公共父级.有什么问题吗?

确切地说,为QWidget注册父母有什么用?父母甚至在内部使用?

addWidget父级必须与构造函数父级相同吗?

Nik*_* B. 17

你的问题实际上有两个方面:

内存管理

树状组织QWidgets(实际上是任何QObjects)是Qt-Framework中使用的内存管理策略的一部分.将QObject父级对象分配给父对象意味着将子对象的所有权传递给父对象.如果删除父项,则还会删除其所有子项.来自文档:

QObjects在对象树中组织自己.当您使用另一个对象作为父对象创建QObject时,该对象将自动将其自身添加到父对象的children()列表中.父母取得对象的所有权; 即,它将自动删除其析构函数中的子项.您可以按名称查找对象,也可以使用findChild()或findChildren()键入.

这意味着您可以以任何对您来说合理的方式组织您的小部件(只要您不引入内存泄漏).但是,我认为通常的做法是将所有小部件分配给各自的容器(显式或更好,使用类似的方法addWidget).

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

现在,一旦主窗口被破坏,基本上整个树都会QObjects被删除,就像你期望的那样.

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

GUI语义

正如弗兰克所指出的那样,在某些情况下,父子关系QWidgets也对GUI框架具有语义意义.这方面的一个例子是模态对话框,只要它们保持打开状态就会阻止它们的父级.

  • 对于对话框,父子关系也定义窗口堆叠,而不将父对象传递给对话框会导致笨拙的行为(模式对话框在后台弹出等) (2认同)