gpt4 book ai didi

c++ - QWidget的 parent 的目的是什么?

转载 作者:可可西里 更新时间:2023-11-01 16:29:57 29 4
gpt4 key购买 nike

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

ZTabWidget::ZTabWidget(QWidget *parent):QTabWidget(parent){
blah ... blah ...
}

通常的模式是:

WidgetB widgetb = new WidgetB(widgeta)
widgeta.addWidget(widgetb);

将我所有的小部件指定为主窗口作为它们各自的父级有什么坏处吗?尽管按照 addWidget 层次结构,大多数这些小部件都有另一个小部件作为 addWidget 父级:

WidgetB widgetb = new WidgetB(mainWindow)
widgeta.addWidget(widgetb);

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

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

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

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

最佳答案

你的问题其实有两个方面:

内存管理

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

QObjects organize themselves in object trees. When you create a QObject with another object as parent, the object will automatically add itself to the parent's children() list. The parent takes ownership of the object; i.e., it will automatically delete its children in its destructor. You can look for an object by name and optionally type using findChild() or findChildren().

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

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

现在,一旦主窗口被销毁,QObjects 的整个树基本上都会像您预期的那样被删除。

因此,如果您让对象“无父对象”,则您有责任将其删除。

GUI 语义

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

关于c++ - QWidget的 parent 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8798313/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com