我使用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 ++中那样被释放了?
答案 0 :(得分:5)
用C ++创建但可从QML访问的对象可以有两个ownership states:
QQmlEngine::CppOwnership
和QQmlEngine::JavaScriptOwnership
。你很少需要设置这个状态,因为Qt通常可以找到合适的状态。在您的示例中,由于对象是从QML调用创建的,因此会自动为其分配QQmlEngine::JavaScriptOwnership
。
当一个对象被分配QQmlEngine::JavaScriptOwnership
时,JS垃圾收集器会在必要时销毁它;很少需要明确销毁它。
最后一件事,如果您想要在QML中销毁对象,请使用destroy()
。 JS delete
关键字用于从对象中删除属性的值和属性本身。