QWidget是否会在销毁时从GUI中删除?

Pie*_*ter 9 qt

如果我删除了一个QWidget使用delete,它是从GUI取消注册还是我必须手动执行此操作?这种行为是否有合理的原因?

Tro*_*our 13

当您调用addWidget布局或堆叠小部件时,小部件的所有权将传输到布局/堆叠小部件.所有这些意味着如果布局/堆叠小部件被删除,那么添加到它的所有小部件也会被删除.

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

如果您不希望在删除布局/堆叠小部件时删除小部件,则可以调用removeWidget.请注意,不清楚窗口小部件的所有权到底在哪里.一个简单的测试应用.我刚刚写道,removeWidget甚至根本没有将所有权转让给QStackedWidget所有人!

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


Abh*_*ith 7

正如@CatPlusPlus已经指出的那样,Qt使用了一个所有权系统.因此,当您将小部件添加到布局或布局到窗口小部件等等时,该加法的所有权将提供给加法器/父级.这通常记录在方法文档中.例如,如果您查看QWidget :: addLayout(QLayout*)的文档,它会说Qwidget拥有QLayout的所有权.删除父项时,它也会删除其所有子项.阅读这篇文章了解更多信息.

Qt中的对象树和所有权

这种方法非常有用,因为在传统的C++中,开发人员必须跟踪堆上分配的每一部分内存.然而,该所有权系统要求开发人员跟踪父母.

  • +1虽然这不直接回答问题(因为问题被表达为是/否问题,但没有给出答案),这个答案中的链接确实包含答案"当树中的任何QObject被删除时,如果对象有父对象,析构函数会自动从父对象中删除对象." 所以这个答案+1. (5认同)