如何删除QActions

时间:2014-06-25 13:31:53

标签: c++ qt

我对Qt中的一件事很困惑:

您经常向QMenu添加新动作,如下所示:

menu.addAction(new QAction("this is a menu"));

所以你要创建一个新对象,但谁删除它?根据{{​​3}},父对象应该照顾这个但是......它总是会发生吗?如果我没有在构造函数中放置任何父对象怎么办?如果我自己删除了该对象,那么父对象SEGFAULT会删除已删除的对象吗?

即使是qt creator创建的默认代码也是在构造函数中创建名为ui的对象,并在析构函数中删除它。这就是我为自己创建的物体所做的事情,但令人惊讶的是,它从未崩溃过。我只是想通了,我可能不应该自己删除它们?

处理这个问题的正确方法是什么?它是否适用于在构造函数中具有指向父对象的指针的所有QObject?

额外问题:如果这些对象被父析构函数删除,是否意味着如果父是仅在退出时关闭的应用程序的主窗口,那么所有新对象都将泄漏直到应用程序关闭?

1 个答案:

答案 0 :(得分:1)

如果要自动删除QObject,则必须指定父级。大多数派生类在一个或多个构造函数参数中提供此功能。

您在上面创建的QAction没有父级,因此在销毁QMenu时不会删除它。要做到这一点,请将行更改为:

menu.addAction(new QAction("this is a menu", &menu));

这是不可取的,因为QActioncommand pattern的一个实现,所以它的目的是在QMenu以外的地方使用,因此它的生命周期不能与QMenu的那个。一个简单的例子就是QToolBar上的一个按钮。

出于这个原因,QMenu在添加时不会使自己成为QAction的父级。

QObject的其他一些派生类确实这样做,因此并不总是需要自己明确地指定父级。

一个常见的例子是QMainWindow。每当您使用QWidget分配setCentralWidget()时,主窗口将获得所有权并强制自己成为新中央窗口小部件的父级,即使您将其他对象设置为窗口小部件的父级。