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