正确的方式来管理内存在Qt时暴露QObject类到qml

Correct way to manage memory in Qt when exposing QObject class into qml?

本文关键字:Qt 暴露 QObject qml 类到 存在 内存 方式 管理      更新时间:2023-10-16

我使用c++来编写我的大部分程序逻辑。我喜欢将c++类暴露在QML中,这样QML就可以使用JS来完成许多复杂的工作。然而,这里出现了一个问题:

如果c++函数返回一个QObject*

Q_INVOKABLE QObject* parseJson(const QString& someArguments)
{
    return new SomeClassExtendsQObject(someArguments);
}
然后将

赋值给JS变量并使用

var result = exposingCppObj.parseJson("I'm Arguments");
result.someMemberFunction(...);
.....

如果我使用

delete result

在QML JS,是实例真的释放像它会在c++ ?

在c++中创建但可以从QML访问的对象可以有两种所有权状态:QQmlEngine::CppOwnershipQQmlEngine::JavaScriptOwnership。您很少需要设置这种状态,因为Qt通常可以计算出合适的状态。在您的示例中,由于对象是通过QML调用创建的,因此它被自动分配为QQmlEngine::JavaScriptOwnership

当一个对象被赋值为QQmlEngine::JavaScriptOwnership时,JS垃圾收集器将在必要时销毁它;很少需要显式地销毁它。

最后一点,如果您确实想在QML中销毁对象,请使用destroy()。JS的delete关键字用于从对象中删除属性的值和属性本身。