如何管理从 C++ 返回到 QML 的 QObject 的生命周期?

How is the lifetime of QObjects returned from C++ to QML managed?

我有一个名为 ToReturn 的 QObject 子类(在 QML 中注册)和一个用 C++ 定义的 QML 单例,名为 MySingleton。后者提供了这个功能:

Q_INVOKABLE ToReturn* get_toReturn() {
    return new ToReturn();
}

当我从 QML 调用 get_toReturn 时,我是否负责稍后对返回的对象调用 destroy()?或者有没有办法为此使用自动内存管理?

请注意,我的 ToReturn 对象在逻辑上不属于对象树,因此我将 nullptr 传递给父构造函数(QObject 的)。

它应该自动工作,并且对象应该在超出范围、没有父对象且不存在对它们的引用时立即删除。

也就是说,有 2 个注意事项:

  • 对象很少会在满足上述条件后立即销毁。它们往往会逗留很长一段时间,除非强制进行垃圾收集

  • 在更复杂的场景中,对象将被删除,即使它们有父对象和对它们的引用。这是一个 critical bug 已经存在了将近 2 年的作品,不幸的是,它的工作量为零。这迫使我使用手动对象生命周期管理,明确地将所有权设置为 CPP,这样对象就不会丢失,这只会使应用程序崩溃

默认情况下,从您的函数返回的对象将具有 QQmlEngine::JavaScriptOwnership,除非您通过以下方式明确设置它:

QQmlEngine::setObjectOwnership(objectptr, QQmlEngine::CppOwnership);

编辑:请注意,过早删除与 JS 所有权有关,因此完全在 QML 中声明和创建的对象也受制于它。您可以为此类对象设置 CPP 所有权以保护它们,并且只能从 C++ 中删除此类对象,最好使用 deleteLater().