#qt #qml
#qt #qml
Вопрос:
Я использую общий общий.модуль qrc (с компонентами QML и кодом javascript), который связан с различными плагинами в разное время сборки.
Я должен убедиться, что каждый плагин использует версию компонента, с которым он был разработан (на выбранное время сборки).
В общем.qrc у меня есть
<qresource prefix="/Comp1Common">
<file alias="NotificationDrawer.qml">NotificationDrawer.qml</file>
<file alias="Drawer.qml">Drawer.qml</file>
</qresource
<qresource prefix="/Comp2Common">
<file alias="NotificationDrawer.qml">NotificationDrawer.qml</file>
<file alias="Drawer.qml">Drawer.qml</file>
</qresource
Таким образом, я могу импортировать в Comp1 соответствующую общую версию (и это не будет конфликтовать с той же общей версией компонента, созданного в другое время), используя
import Comp1Common
Это все хорошо. Но если я хочу использовать синглтоны (все еще определенные в common.qrc) определяется следующим образом (в соответствующем qmldir в common.qrc)
singleton Comp Comp.qml
Каждый раз, когда я использовал бы Comp, который является синглтоном, он выбирал бы первую загруженную версию (для первого загруженного плагина), а не выбирал то, что связано во время сборки в текущем плагине.
Описанное управление версиями работает только для экземпляров, отличных от sigleton. ФАЙЛ: Дальнейшие тесты показали, что на обычное создание экземпляра (например, Drawer.qml) также влияет кэш. Первый компонент, загруженный первым плагином, используется вторым.
Комментарии:
1. Обязательно ли, чтобы Comp был одноэлементным? Насколько я знаю, singleton по сути статичен, было бы нетривиально перезагрузить его или переоценить ссылку на Comp во время выполнения.
2. @dabbler Я обновил свои выводы. Он также терпит неудачу и для не одиночных файлов. Невозможно сделать так, чтобы кэширование не влияло на правильную загрузку ящика, например.
3. Возможно, вы можете вызвать QQmlEngine::trimComponentCache , чтобы выгрузить не одноэлементный материал, не уверен в одноэлементном кэше, но стоит попробовать
4. Это прискорбно, хотя и не удивительно. Кажется, вам может потребоваться немного перестроить настройки вашего «плагина». Возможно, вы могли бы сделать что-то вроде переноса регистрации компонента на C , предоставить версионный экземпляр интерфейса плагина через qmlRegisterType , а затем попросить плагин QML импортировать ожидаемый версионный тип (который дает доступ к правильным версиям компонентов). Должно быть выполнимо, поскольку вы подчеркиваете, что это делается во время сборки.
5. Оказывается, я использовал псевдонимы / префиксы глупым способом. Проблема в том, что мне нужно было использовать другой префикс каждый раз, когда я обновлял свой common.qrc. таким образом, каждый плагин использует локальные ресурсы, если в инструкции import указано, что ему необходимо использовать определенную версию. Что-то вроде импорта compcommon VX.
Ответ №1:
Оказывается, я использовал псевдонимы / префиксы глупым способом. Проблема в том, что мне нужно было использовать другой префикс каждый раз, когда я обновлял свой common.qrc. таким образом, каждый плагин использует локальные ресурсы, если в инструкции import указано, что ему необходимо использовать определенную версию. Что-то вроде импорта compcommon VX.