我正在集成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
存储一个强引用(增加引用计数或其他内容)?