Путаница с загрузкой Qt и плагинов - PullRequest
0 голосов
/ 19 сентября 2019

У нас есть (довольно большое) приложение, которое:

  1. использует QML в качестве интерфейса, в одном из окон приложений используются компоненты QML, хранящиеся в компонентах QML, предоставляющих плагины (назовите его плагином конфигурации)
  2. имеет несколько других плагинов, которые загружаются динамически через QPluginLoader.

Один из этих других плагинов также имеет интерфейс QML, которому также нужны QML, предоставляемые из компонента QML, предоставляющего плагин конфигурации.

Основная проблема заключается в следующем:

  1. если мы загрузим другой плагин, который «теоретически» инициализирует плагин, предоставляющий QML (вызывая registerTypes, который выполняет все вызовы qmlRegisterType), QML из плагина доступен изинтерфейс других плагинов, но не из интерфейса наших приложений (имеется в виду: когда мы создаем окно в основном приложении, используя QML из плагина, ничего не видно, но мы видим из журналов (console.log), что все компоненты былисоздается нормально)

  2. если мы взломаем систему и вызовем из основного приложения напрямую registerTypes плагина предоставления QML, то интерфейс QML основных приложений покажет компоненты конфигурации изплагин config QML, однако другой плагин не загружается, с жалобой вроде:

Plugin loader error: "Failed to initialised plugin /usr/lib/vcs-gui/plugins/libother.so: qrc:///wbmshi-gui/SettingsBrowser.qml:2:1: plugin cannot be loaded for module \"conftree\": Namespace 'conftree' has already been used for type registration"

(где conftree - фактическое имя подключаемого модуля конфигурации)

Чтобы сделать вещи более неясными, это поведение началось, когда мы перешли от старой сборки на основе qmakeсистема до cmake.Возможно, нам не удалось воссоздать некоторые уловки черной магии qmake.

Любые предложения приветствуются в этой ситуации.

...