我对Qt中的一件事很困惑:
您经常向QMenu添加新动作,如下所示:
menu.addAction(new QAction("this is a menu"));
所以你要创建一个新对象,但谁删除它?根据{{3}},父对象应该照顾这个但是......它总是会发生吗?如果我没有在构造函数中放置任何父对象怎么办?如果我自己删除了该对象,那么父对象SEGFAULT会删除已删除的对象吗?
即使是qt creator创建的默认代码也是在构造函数中创建名为ui
的对象,并在析构函数中删除它。这就是我为自己创建的物体所做的事情,但令人惊讶的是,它从未崩溃过。我只是想通了,我可能不应该自己删除它们?
处理这个问题的正确方法是什么?它是否适用于在构造函数中具有指向父对象的指针的所有QObject?
额外问题:如果这些对象被父析构函数删除,是否意味着如果父是仅在退出时关闭的应用程序的主窗口,那么所有新对象都将泄漏直到应用程序关闭?
答案 0 :(得分:1)
如果要自动删除QObject
,则必须指定父级。大多数派生类在一个或多个构造函数参数中提供此功能。
您在上面创建的QAction
没有父级,因此在销毁QMenu
时不会删除它。要做到这一点,请将行更改为:
menu.addAction(new QAction("this is a menu", &menu));
这是不可取的,因为QAction
是command pattern的一个实现,所以它的目的是在QMenu
以外的地方使用,因此它的生命周期不能与QMenu
的那个。一个简单的例子就是QToolBar
上的一个按钮。
出于这个原因,QMenu
在添加时不会使自己成为QAction
的父级。
QObject
的其他一些派生类确实这样做,因此并不总是需要自己明确地指定父级。
一个常见的例子是QMainWindow
。每当您使用QWidget
分配setCentralWidget()
时,主窗口将获得所有权并强制自己成为新中央窗口小部件的父级,即使您将其他对象设置为窗口小部件的父级。