gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:54 25 4
gpt4 key购买 nike

我对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com