Qt:将“ setContextProperty”与“ QObject”和“ JavaScriptOwnership”一起使用会导致项目被收集/删除

时间:2018-09-23 23:37:36

标签: qt garbage-collection qml

我正在集成QML和.NET。 (project link

将.NET对象发送到QML时,我用NetValue : public QObject C ++类型包装它。

NetValue类型存储对基础.NET对象的强引用,以防止.NET GC在QML中处于活动状态。

我使用QQmlEngine::setObjectOwnership(netValue, QQmlEngine::JavaScriptOwnership);,以便QML完成后会删除NetValue。然后,我使用NetValue::~NetValue()告诉.NET发布强引用。

到目前为止,这对我来说效果很好,但是我遇到了一个问题。请考虑以下内容。

QObject* testObject = new TestObject();
QQmlEngine::setObjectOwnership(testObject, QQmlEngine::JavaScriptOwnership);
engine.rootContext()->setContextProperty("testObject", testObject);

在某个时候,我的TestObject将被销毁。

我希望setContextProperty强烈引用QObject类型,以防止它在QML中被GC处理。

使用QQmlEngine::CppOwnership可以解决此问题,但是正如我先前所解释的,我需要使用QQmlEngine::JavaScriptOwnership来跟踪QML类型的生存期,该类型包含对.NET对象的引用。 / p>

为什么setContextProperty不为我通过的QObject存储一个强引用(增加引用计数或其他内容)?

0 个答案:

没有答案