c++ - QActions是如何被删除的

标签 c++ qt

我对 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));

这是不可取的,因为 QActioncommand pattern 的一个实现因此它旨在用于比 QMenu 更多的地方,因此它的生命周期不能与 QMenu 的生命周期相关联。一个简单的示例是作为 QToolBar 上的按钮。

因此,当您添加 QMenu 时,它不会使自己成为 QAction 的父级。

QObject 的一些其他派生类确实会这样做,因此并不总是需要自己显式分配父级。

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

关于c++ - QActions是如何被删除的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24410164/

相关文章:

c# - 从 C# 调用 C++ DLib 导致错误分配异常

c++ - 如何在 xcode 中使用 gmock?

java - 使用占碑创建自定义日历

c++ - Qt QTextEdit 添加虚假行

json - 如何在 QT 中将 JSON 字符串格式化为可读输出

qt - 使用 Qt4 捕获多屏幕桌面图像

c++ - 为什么主可执行文件和 dlopen 加载的共享库共享一个命名空间静态变量的拷贝?

c++ - 链接到 .a,但仍然需要 .so? (C++, Linux)

python - 导入 Pybind11/C++ 编译模块不起作用

c++ - 尝试用 Qt 打开文件对话框