代码之家  ›  专栏  ›  技术社区  ›  Stefan Monov

如何管理从C++返回到QML的QoObject的生存期?

  •  1
  • Stefan Monov  · 技术社区  · 8 年前

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

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

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

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   dtech    8 年前

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

    也就是说,有两个警告:

    • 只要满足上述条件,物体很少会被销毁。除非强制垃圾收集,否则它们往往会逗留很长时间

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

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

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

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