如果我将任何小部件子类化,通常的模式是:
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父级必须与构造函数父级相同吗?
答案 0 :(得分:16)
您的问题实际上有两个方面:
QWidgets
(实际上是任何QObjects
)的树状组织是Qt-Framework中使用的内存管理策略的一部分。将QObject
分配给父级意味着将子对象的所有权传输到父对象。如果删除父项,则还会删除其所有子项。来自docs:
QObjects在对象树中组织自己。当你创建一个 QObject以另一个对象作为父对象,该对象将自动生成 将自己添加到父级的children()列表中。父母拥有所有权 对象;即,它将自动删除其中的子女 析构函数。您可以按名称查找对象,也可以选择键入 使用findChild()或findChildren()。
这意味着您可以以任何对您来说合理的方式组织您的小部件(只要您不引入内存泄漏)。但是,我认为通常的做法是将所有小部件分配到各自的容器中(使用addWidget
等方法明确或更好地使用。
如果使用QLayout
将窗口小部件分配给addWidget
,则窗口小部件的所有权将转移到布局(而布局可能由另一个周边布局或主窗口拥有)。所以,是的,这个方法定义的关系包括上面描述的更一般的父子关系。
现在,只要主窗口被销毁,基本上整个QObjects
树就会被删除。
因此,如果您将某个对象保留为“无父对象”,则删除该对象是您自己的责任。
正如弗兰克所说,在某些情况下,QWidgets
之间的父子关系对GUI框架也具有语义意义。一个例子是模态对话框,只要它们保持打开状态就会阻止它们。