将 QObject class 公开到 qml 时,在 Qt 中管理内存的正确方法?

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

我使用 C++ 来编写我的大部分程序逻辑。我喜欢将 C++ 类 公开到 QML 中,以便 QML 可以使用 JS 来完成许多复杂的工作。但是,问题来了:

如果C++函数return一个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 访问的对象可以有两个 ownership statesQQmlEngine::CppOwnershipQQmlEngine::JavaScriptOwnership。您很少需要设置此状态,因为 Qt 通常可以计算出合适的状态。在您的示例中,由于对象是从 QML 调用创建的,因此它会自动分配 QQmlEngine::JavaScriptOwnership.

当一个对象被赋值时QQmlEngine::JavaScriptOwnershipJS垃圾收集器会在必要时销毁它;很少需要明确销毁它。

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