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

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拥有应用程序的所有主要项目,并且我可以让我的任何子类化小部件引用这些项目。

实际上,我正在考虑仅使用代理小部件来保存一些公共(public)引用,并将该代理小部件用作我所有小部件的公共(public)父级。有什么问题吗?

确实,为QWidget注册了父级有什么用? parent 甚至在内部使用吗?

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

最佳答案

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

内存管理
QWidgets(实际上是任何QObjects)的树状组织是Qt-Framework中使用的内存管理策略的一部分。将QObject分配给父对象意味着将子对象的所有权转移到父对象。如果父项被删除,则其所有子项也将被删除。从docs:



这意味着您可以以您认为合适的任何方式来组织窗口小部件(只要不引入内存泄漏)。但是,我认为将所有小部件分配到各自的容器是一种普遍的做法(使用addWidget这样的方法来显式或更好地分配)。

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

现在,一旦主窗口被破坏,基本上整个QObjects树都将按照您的期望删除。

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

GUI语义

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

10-03 00:49