在将QObject类暴露给qml时,在Qt中管理内存的正确方法是什么?

时间:2015-07-22 08:05:07

标签: c++ qt qml qtquick2

我使用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 ++中那样被释放了?

1 个答案:

答案 0 :(得分:5)

用C ++创建但可从QML访问的对象可以有两个ownership statesQQmlEngine::CppOwnershipQQmlEngine::JavaScriptOwnership。你很少需要设置这个状态,因为Qt通常可以找到合适的状态。在您的示例中,由于对象是从QML调用创建的,因此会自动为其分配QQmlEngine::JavaScriptOwnership

当一个对象被分配QQmlEngine::JavaScriptOwnership时,JS垃圾收集器会在必要时销毁它;很少需要明确销毁它。

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