如何管理从 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()
.
我有一个名为 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()
.