正确的方式来管理内存在Qt时暴露QObject类到qml
Correct way to manage memory in Qt when exposing QObject class into qml?
我使用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::CppOwnership
和QQmlEngine::JavaScriptOwnership
。您很少需要设置这种状态,因为Qt通常可以计算出合适的状态。在您的示例中,由于对象是通过QML调用创建的,因此它被自动分配为QQmlEngine::JavaScriptOwnership
。
当一个对象被赋值为QQmlEngine::JavaScriptOwnership
时,JS垃圾收集器将在必要时销毁它;很少需要显式地销毁它。
最后一点,如果您确实想在QML中销毁对象,请使用destroy()
。JS的delete
关键字用于从对象中删除属性的值和属性本身。
相关文章:
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- Qt focusObjectChanged example?
- 如何在cpp文件之间切换窗口?在Qt中
- Qt和C++:将QLineEdit添加到QTabWidget中
- 从数据库实时显示QT c++中的数据
- Qt Quick-如何仅从c++代码与qml属性交互
- 无法使用Qt Creator在Windows中构建yaml-cpp
- QT:将任何C 对象暴露于JavaScript
- 正确的方式来管理内存在Qt时暴露QObject类到qml
- 在Qt 5.0中将QAbstractListModel元素属性暴露给QML