Qt5 QML-модуль не установлен

Я запутался в модулях Qt QML. Я прочитал все документы, но в нем не указаны некоторые основные идеи.

Я понимаю, что могу поместить кучу QML файлов в каталог и добавить файл qmldir для описания идентифицированного модуля. Когда я это сделаю и настрою QML_IMPORT_PATH, QtCreator счастлив и перестает подчеркивать строку ModuleName 1.0 импорта.

Итак, создатель счастлив, но он не работает. Я получаю модуль не установлен. мои вопросы:

  • что это значит "установлен". У меня есть каталог файлов, но я их нигде не "установил".
  • Должен ли я создавать/компилировать модуль для создания DLL/.so?
  • ли файлы модуля QML попадают в ресурсы основного приложения, в противном случае, где они должны быть найдены?
  • my main.qml файл является частью ресурсов приложения, как приложение находит ресурсы модуля во время выполнения.

Извините, за все эти вопросы, но основы этих модулей просто не ясны. Я не понимаю, является ли "модуль" просто обмен файлами или это скомпилированный блок.

спасибо за любую помощь.

Ответ 1

Я постараюсь ответить на ваши вопросы:

  • Я думаю, что установленный означает, что они расположены на правильных дорожках, так что что они могут быть найдены во время выполнения
  • Вы не должны создавать/строить QmlExtrensionPlugin для этой цели. Вы также можете использовать в качестве модуля простые файлы QML в одном каталог с qmldir, описывающим этот модуль. Это вопрос распространение вашего кода - с QmlExtensionPlugin вы предоставляете модуль скомпилирован, если вы хотите скрыть код.
  • Модули могут быть в системе ресурсов или в виде файлов на диске, это зависит от вас.
  • Приложение ищет модули в предопределенных путях - в вашем каталоге приложений в пути плагинов QT в QML2_IMPORT_PATH в каталогах, которые вы добавили с помощью engine->addImportPath()

Есть куча вещей, которые могут привести к тому, что модуль не будет загружен. Вы можете проверить следующее:

  • Идентификатор модуля в qmldir должен быть таким же, как в каталоге имя, где действительно находится модуль. Например, если ваш модуль имеет идентификатор модуля module TestModule в qmldir, ваши модули имя каталога должно быть TestModule.
  • Если это расширение QML плагин (общая библиотека), убедитесь, что имя каталога плагина так же, как имя плагина.
  • export QML2_IMPORT_PATH (убедитесь, что есть имя 2 в имени) env, чтобы указать на каталог, содержащий ваш модуль. Существует также метод QQmlEngine::addImportPath, который добавляет каталог в список для поиска плагинов.
  • Если это плагин расширения qml (общая библиотека), тогда для него могут отсутствовать зависимости. Вы можете проверить его Dependency Walker в Windows или ldd в Linux.
  • Настройка переменной QT_PLUGIN_PATH runtime может помочь загрузить плагины. Он должен указывать на каталог, содержащий каталог плагинов, а не сам каталог плагина.
  • Вы также можете включить трассировки, чтобы увидеть, что происходит, когда плагины загружаются для лучшего понимания проблемы - экспорт QT_DEBUG_PLUGINS=1 и QML_IMPORT_TRACE=1 переменных среды

Вы также можете прочитать эту ссылку: https://doc.qt.io/qt-5/qtqml-modules-identifiedmodules.html

Ответ 2

В моем случае (у меня есть все QML файлы в ресурсах qrc), чтобы добавить qmldir в ресурсы также и вызвать метод addImportPath ( "qrc:/" ) QQmlApplicationEngine.

Мой main.cpp выглядит так:

QQmlApplicationEngine engine;
engine.addImportPath("qrc:/");
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

Важные части моего файла .pro выглядят следующим образом:

RESOURCES += qml.qrc \
    MyModule/mymodule.qrc

QML_IMPORT_PATH += $$PWD

Мой qmldir:

module MyModule

MyItem          2.0 MyItem20.qml
MyItem          2.1 MyItem21.qml

Мой qrc:

<RCC>
    <qresource prefix="/MyModule">
        <file>MyItem20.qml</file>
        <file>MyItem21.qml</file>
        <file>qmldir</file>
    </qresource>
</RCC>

И, наконец, мой main.qml:

import QtQuick 2.5
import QtQuick.Window 2.2

import MyModule 2.0

Window {
    visible: true
    width: 640
    height: 480

    MyItem {
        anchors.fill: parent
    }
}

QtCreator счастлив (не подчеркивая компоненты и импорт), и модуль загружен. Надеюсь, это поможет.

Ответ 3

У меня была такая же проблема, и теперь она исправлена. Я нашел плагин QML для iOS. Есть несколько вещей, о которых нужно позаботиться:

1. Для файла plugin pro требуется дополнение:

uri = IosTestPulgin

# this for error:
# static plugin for module "QtQuick" with name "IosTestPulgin" 
# has no metadata URI
QMAKE_MOC_OPTIONS += -Muri=$$uri

# thanks from:https://github.com/wang-bin/QtAV/issues/368

2. Файл qmldir для QML-плагина нуждается в дополнительной строке:

classname IosqmlpluginPlugin
# for ERROR: Plugin iostestqmlplugin is missing a classname entry,
# please add one to the qmldir file.
# look for qt document http://doc.qt.io/qt-5.6/qtqml-modules-qmldir.html

3 Для файла проекта pro project клиента требуется следующее:

ios {
    IOSTestPlugin_BUNDLE.files += $$files($$[QT_INSTALL_QML]/IosTestPulgin/qmldir)
    IOSTestPlugin_BUNDLE.path =  IosTestPulgin
    QMAKE_BUNDLE_DATA += IOSTestPlugin_BUNDLE
}
# for ios error: module is not installed
# this means external qml static plugin must add the plugin dir by manual
# in the app root dir