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

zzy*_*zzy 4 c++ qt qml qtquick2

我正在使用C++来编写我的大部分程序逻辑.我喜欢将C++类暴露给QML,以便QML可以使用JS来完成许多复杂的工作.但是,出现了一个问题:

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

Q_INVOKABLE QObject* parseJson(const QString& someArguments)
{
    return new SomeClassExtendsQObject(someArguments);
}
Run Code Online (Sandbox Code Playgroud)

然后将其分配给JS变量并使用

var result = exposingCppObj.parseJson("I'm Arguments");
result.someMemberFunction(...);
.....
Run Code Online (Sandbox Code Playgroud)

如果我使用

delete result
Run Code Online (Sandbox Code Playgroud)

在QML JS中,实例是否真的像在C++中一样被释放?

cma*_*t85 5

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

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

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