Qt: Использование "setContextProperty" с "QObject" и "JavaScriptOwnership" вызывает сбор / удаление элемента - PullRequest
0 голосов
/ 24 сентября 2018

Я интегрирую 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, который я передаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...