Je suis confus à propos des modules dans Qt QML. J'ai lu tous les documents, mais cela ne précise pas certaines idées de base.
Je comprends que je peux mettre un tas de fichiers QML dans un répertoire et ajouter un fichier qmldir pour décrire un module identifié. Quand je fais cela et que j'ajuste QML_IMPORT_PATH, QtCreator est content et arrête de souligner la ligne d'importation ModuleName 1.0.
Donc, le créateur est heureux, mais cela ne fonctionne pas. Je reçois le module n'est pas installé . Mes questions sont:
Désolé, pour toutes ces questions, mais les bases de ces modules ne sont tout simplement pas claires. Je ne comprends pas si un "module" est simplement le partage de fichiers ou s'il s'agit d'une unité compilée.
merci pour toute aide.
Je vais essayer de répondre à vos questions:
engine->addImportPath()
.Il y a beaucoup de choses qui peuvent empêcher le chargement d'un module. Vous pouvez vérifier les éléments suivants:
module TestModule
dans qmldir, votre nom de modulesdirectory doit être TestModule
.QML2_IMPORT_PATH
(assurez-vous que le nom contient 2
) variable env pour pointer vers le répertoire contenant votre module. Il existe également une méthode QQmlEngine::addImportPath
, qui ajoute le répertoire à la liste pour rechercher des plugins.ldd
sous Linux.QT_PLUGIN_PATH
peut aider à charger les plugins. Il devrait pointer sur un répertoire contenant le répertoire de votre plugin, pas sur le répertoire du plugin lui-même.QT_DEBUG_PLUGINS=1
et QML_IMPORT_TRACE=1
Vous pouvez également lire ce lien: https://doc.qt.io/qt-5/qtqml-modules-identifiedmodules.html
Dans mon cas (j'ai tous les fichiers QML dans les ressources qrc), j'ai également ajouté qmldir aux ressources et appelé la méthode addImportPath ("qrc: /") de QQmlApplicationEngine.
Mon main.cpp ressemble à:
QQmlApplicationEngine engine;
engine.addImportPath("qrc:/");
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
Les parties importantes de mon fichier .pro ressemblent à:
RESOURCES += qml.qrc \
MyModule/mymodule.qrc
QML_IMPORT_PATH += $$PWD
Mon qmldir:
module MyModule
MyItem 2.0 MyItem20.qml
MyItem 2.1 MyItem21.qml
Mon qrc:
<RCC>
<qresource prefix="/MyModule">
<file>MyItem20.qml</file>
<file>MyItem21.qml</file>
<file>qmldir</file>
</qresource>
</RCC>
Et enfin mon 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 est heureux (ne souligne pas les composants et les importations) et le module est chargé . J'espère que cela vous aidera.
Je souhaite développer/ la réponse d'arxarian - qui, je pense, est la meilleure technique pour intégrer des modules - mais ne peut pas intégrer ces idées dans un commentaire. Voici donc une nouvelle réponse.
Il est important de commencer par comprendre que les modules qml et leurs ressources associées sont des entités d'exécution et sont supposés exister séparément à un emplacement donné par rapport à l'exécutable, à moins qu'ils ne soient inclus dans les ressources de l'application. En les incluant dans les ressources, ce sont toujours des entités d'exécution, mais elles existent sous le chemin d'accès qrc:/root dans le binaire de l'application. Cacher les modules est la raison principale pour laquelle j'estime qu'il s'agit de la meilleure technique, sauf si vous souhaitez que vos modules soient ouverts à la révision après le déploiement ou qu'ils puissent être déployés indépendamment en tant que plugins précompilés (c'est-à-dire, dans le stockage de ressources d'un serveur lié dynamiquement). bibliothèque).
Alors, voici mon explication des éléments importants de la réponse d'Arxarian :
engine.addImportPath("qrc:/");
est nécessaire dans le code C++ avant de charger le qml pour indiquer au moteur de rechercher des modules qml dans le stockage des ressources de l'application.RESOURCES += MyModule/mymodule.qrc
est nécessaire dans le fichier de projet (.pro) pour ajouter les fichiers du module au application resource storage .QML_IMPORT_PATH += $$PWD
dans le fichier de projet indique à Qt Creator de rechercher le module à partir de la racine de l'arborescence des sources du projet. Dans mon cas, je devais définir ceci dans un sous-répertoire (par exemple, "ui/modules") car mes répertoires de modules avaient commencé à cet endroit. Le chemin d'importation doit inclure la ou les racine (s) sous tous les répertoires de module. Autant que je sache, cette instruction ne concerne que Qt Creator IDE et n'a pas d'incidence sur la construction - c'est pourquoi # 1 est nécessaire.<qresource prefix="/MyModule">
dans le fichier .qrc du module définit le sous-répertoire du module par rapport à qrc:/root dans le stockage des ressources de l'application.import MyModule <version>
dans qml est maintenant configurée pour réussir. Au démarrage, le moteur aura localisé le module dans son répertoire sous qrc: /, analysé le fichier qmldir afin de définir le module et établi le nom et la version à partir de ces entrées.J'espère que cela aidera les autres à comprendre ce qui se passe, et s'il vous plaît laissez-moi savoir si j'ai mal compris quelque chose.
Un problème similaire m'a coûté un peu de temps, je l'ai donc posté ici pour peut-être sauver l'effort d'un autre gars.
Mon problème était qu'un personnage invisible s'était introduit dans le nom du module. Probablement par copier/coller. Voici mon numéro:
Exemple d'erreur de sortie:
MyEngine failed to load component
qrc:/qml/main.qml:53 Type MyComponent unavailable
file:///Users/<pathToProject>/MyProject/qml/MyModule/MyComponent.qml:-1 No such file or directory
Tout semble aller bien et le chemin affiché est en effet le bon. Alors qu'est-ce qui ne va pas?
Maintenant, copiez ce chemin dans une fenêtre de terminal:
file:///Users/<pathToProject>/MyProject/qml/MyModule/<feff>MyComponent.qml
Le voici:
"<feff>"
Le problème a été résolu en retapant manuellement le nom du composant dans le fichier qmldir, supprimant ainsi le caractère invisible.