Я интегрирую QML и .NET.( ссылка на проект )
Когда я отправляю объекты .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
,предотвращение его GC'd в QML.
Использование QQmlEngine::CppOwnership
устраняет проблему, но, как я объяснил ранее, мне нужно использовать QQmlEngine::JavaScriptOwnership
, чтобы отслеживать время жизни обертывающего типа QML, который содержитссылка на объект .NET.
Почему setContextProperty
не хранит сильную ссылку (увеличить счетчик ссылок или что-то в этом роде) на мой QObject
, который я передаю?