如果我使用QWidget
删除delete
,是否会从GUI取消注册,还是必须手动执行此操作?这种行为有合理的原因吗?
答案 0 :(得分:12)
当您在布局或堆叠小部件上调用addWidget
时,小部件的所有权将转移到布局/堆叠小部件。所有这些意味着如果布局/堆叠小部件被删除,那么添加到它的所有小部件也会被删除。
完成它后,删除一个小部件是完全可以的无论谁拥有它。所有权只是清除对象层次结构内存的便捷方式。它绝不会说拥有它的对象必须删除它。如果是这种情况,那么一旦你添加了所有小部件,你就只能将它们全部删除或者根本没有它们!
如果您不希望在删除布局/堆叠小部件时删除小部件,则可以调用removeWidget
。请注意,不清楚窗口小部件的所有权到底在哪里。一个简单的测试应用。我刚刚写道,removeWidget
甚至没有将所有权从QStackedWidget
转移出去!
因此,要回答您的问题,如果删除它,Qt将从布局/堆叠小部件中正确删除小部件。此外,如果窗口小部件不再属于布局/堆叠小部件,这是正确的方法,用于删除小部件。
答案 1 :(得分:7)
正如@CatPlusPlus已经指出的那样,Qt使用了一个所有权系统。因此,当您将小部件添加到布局或布局到窗口小部件等等时,该加法的所有权将提供给加法器/父级。这通常记录在方法文档中。例如,如果您查看QWidget :: addLayout(QLayout *)的文档,它会说Qwidget拥有QLayout的所有权。删除父项时,它也会删除其所有子项。 阅读这篇文章了解更多信息。
Object Trees and Ownership in Qt
此方法非常有用,因为在传统的C ++中,开发人员必须跟踪堆上分配的每个内存位。然而,该所有权系统要求开发人员跟踪父母。