Qt QWidget是否在销毁时从GUI中删除自身?

Qt QWidget是否在销毁时从GUI中删除自身?,qt,Qt,如果我使用delete删除QWidget,它是从GUI中注销自己,还是必须手动执行此操作?这种行为有逻辑上的原因吗?正如@CatPlusPlus所指出的,Qt使用所有权系统。因此,当您将小部件添加到布局或将布局添加到小部件等时,加法器的所有权将授予加法器/父级。这通常记录在方法文档中。例如,如果您查看QWidget::addLayout(QLayout*)的文档,就会发现QWidget拥有QLayout的所有权。删除父对象时,它也会删除其所有子对象。 阅读本文了解更多信息 此方法非常有用,因为

如果我使用
delete
删除
QWidget
,它是从GUI中注销自己,还是必须手动执行此操作?这种行为有逻辑上的原因吗?

正如@CatPlusPlus所指出的,Qt使用所有权系统。因此,当您将小部件添加到布局或将布局添加到小部件等时,加法器的所有权将授予加法器/父级。这通常记录在方法文档中。例如,如果您查看QWidget::addLayout(QLayout*)的文档,就会发现QWidget拥有QLayout的所有权。删除父对象时,它也会删除其所有子对象。 阅读本文了解更多信息


此方法非常有用,因为在传统C++中,开发人员必须跟踪堆上分配的每个内存位。然而,这种所有权体系要求开发者只跟踪父控件。

当您在布局或堆叠小控件上调用
addWidget
时,小控件的所有权转移到布局/堆叠小控件。这意味着,如果布局/堆叠小部件被删除,那么添加到其中的所有小部件也会被删除

一旦你完成了一个小部件,不管它是谁的,都可以删除它。所有权只是清除对象层次结构内存的一种方便方式。它决不是说拥有它的对象必须删除它。如果是这样的话,那么一旦你添加了所有的小部件,你就只能全部或根本不删除它们了

如果您不希望在删除布局/堆叠小部件时删除小部件,则可以调用
removeWidget
。请注意,目前还不清楚小部件的所有权到底在哪里。一个简单的测试应用程序。我刚刚写的文章表明,
removeWidget
甚至没有将所有权从
QStackedWidget
转移出去


因此,为了回答您的问题,如果您删除该小部件,Qt将正确地从布局/堆叠小部件中删除它。此外,如果小部件不再属于布局/堆叠小部件,这是删除小部件的正确方法。

什么是“取消注册”?当我想向窗口添加小部件时,我必须执行
addWidget
调用。类似地,我可以执行
removeWidget
从窗口中删除小部件。我想知道当一个小部件被
delete
'd注册时,它是否会在任何地方自动执行此操作。Qt使用所有权系统,如果小部件属于其他东西,您不应该手动删除它们(家长将删除它们)。我不会在析构函数中删除它们。我想知道的是:当我
删除myQWidget
时,widget是从布局中删除自己,还是在删除它之前我必须明确地这样做?好问题;虽然正常的行为是让父母删除他们的孩子,但直接删除孩子通常是有用的。例如,在动态更新布局时,我必须这样做。它总是“起作用”,我认为Qt在所有权方面做的是正确的。我很高兴得到确认(如下面答案中链接到的Qt文档所示)。+1虽然这没有直接回答问题(因为问题的措辞是“是/否”问题,但没有给出答案),但此答案中的链接确实包含答案“当树中的任何QObject被删除时,如果该对象有父对象,析构函数将自动从其父对象中删除该对象。”因此,此答案为+1。“如果您删除该小部件,Qt将正确地从布局/堆叠小部件中删除它。“是否持续”它“参考小部件或布局?小部件,因为这是您的问题。只是检查一下。:)谢谢大家!