我想知道如下所示的课程,是否需要手动拨打delete mainLayout
?
class Dummy : public QWidget {
public:
Dummy() { mainLayout = new QHBoxLayout(); setLayout(mainLayout); }
~Dummy() { delete mainLayout; }
private:
QHBoxLayout *mainLayout;
}
QApplication会自动发布所有子窗口小部件吗?
答案 0 :(得分:4)
当调用Dummy对象析构函数时,它的基类QWidget析构函数也将被调用(通过C ++),并且QWidget析构函数负责删除其父作为此Dummy对象的任何窗口小部件。也就是说,此Dummy对象的每个子节点都会被自动删除。
然后递归,所有孩子的孩子都被删除了。
因此,当关闭Qt应用程序时,您需要手动删除的唯一QWidgets(实际上是QObject)是父级为0的那些,即顶级的。他们的破坏者将自动确保他们所有的孩子都被摧毁。
如Qt namespace page中所述,还有标志Qt :: WA_DeleteOnClose。这样:
当小部件接受了close事件时,让Qt删除这个小部件(参见QWidget :: closeEvent())。
我认为这个标志并不常用。因此,一个好的一般规则就是确保在应用程序关闭时删除顶级小部件。