Qt5 QML module n'est pas installé
Je suis confus au sujet de modules de Qt QML. J'ai lu toutes les docs, mais il ne fait pas clair certaines idées de base.
Je comprends que je peux mettre un tas de QML des fichiers dans un répertoire et ajouter un qmldir fichier pour décrire un module. Quand je fais cela et ajuster la QML_IMPORT_PATH, QtCreator est heureux et s'arrête en soulignant l'importation ModuleName 1.0 ligne.
Donc créateur est heureux, mais il ne fonctionne pas. Je reçois module n'est pas installé.
mes questions sont les suivantes:
- que faut-il dire par "installé". J'ai répertoire de fichiers, mais je n'ai pas "installé" n'importe où.
- devrais-je être bâtiment/compiler le module pour faire une DLL/.de la sorte ?
- ne le module QML des fichiers à intégrer les ressources de l'application principale, sinon, où sont-ils?
- mon principal.qml fichier est une partie des ressources de l'application, comment l'app localiser les ressources du module au moment de l'exécution.
Désolé pour toutes ces questions, mais les bases de ces modules n'est tout simplement pas clair. Je ne comprends pas si un "module" est juste le partage de fichiers, ou est-il compilé unité.
merci pour toute aide.
source d'informationauteur jkj yuio
Vous devez vous connecter pour publier un commentaire.
Je vais essayer de répondre à vos questions:
qu'elles peuvent être trouvées lors de l'exécution
répertoire avec un qmldir décrivant ce module. C'est la question de
la distribution de votre code avec QmlExtensionPlugin vous fournir la
module compilé, si vous voulez cacher le code.
engine->addImportPath()
Il y a un tas de choses qui peuvent conduire à un module n'est pas chargé. Vous pouvez vérifier les points suivants:
nom, où le module réside effectivement. Par exemple, si votre module
a identificateur de module
module TestModule
dans qmldir, vos modulesnom du répertoire doit être
TestModule
.plugin (bibliothèque partagée), assurez-vous que le plugin du nom de répertoire est
le même que le plugin du même nom.
QML2_IMPORT_PATH
(assurez-vous qu'il est2
dans le nom) env variable pour pointer vers le répertoire contenant votre module. Il y a aussi unQQmlEngine::addImportPath
méthode, qui ajoute le répertoire de la liste de recherche pour les plugins.ldd
de commande sur Linux.QT_PLUGIN_PATH
variable d'exécution peut aider à charger les plugins. Il devrait pointer vers un répertoire contenant votre plugin directory, pas le plugin du répertoire lui-même.QT_DEBUG_PLUGINS=1
etQML_IMPORT_TRACE=1
variables d'environnementVous 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 scfq ressources) a travaillé à ajouter qmldir de ressources et d'appeler la méthode addImportPath("qrc:/") de QQmlApplicationEngine.
Mon main.cpp ressemble:
Des parties importantes de mon .pro fichier ressemble à ceci:
Mon qmldir:
Mon qrc:
Et enfin mon principal.qml:
QtCreator est heureux (pas de soulignement des composants et des importations) et le module est chargé.
Espérons que cette aide.
Je souhaite étendre sur arxarian réponse - qui je pense est la meilleure technique pour l'intégration de modules - mais ne correspondent pas à ces pensées dans un commentaire, alors voici une nouvelle réponse.
Il est d'abord important de comprendre que qml modules et leurs ressources associées sont des entités d'exécution et considérés séparément exister à un certain endroit par rapport à l'exécutable, sauf s'ils sont inclus dans les ressources de l'application. En les incluant dans les ressources, ils sont toujours d'exécution des entités, mais elles existent en vertu de la scfq:/chemin de la racine à l'intérieur de l'exécutable de l'application. Cette dissimulation de modules est la principale raison pourquoi je pense que c'est la meilleure technique, sauf si vous voulez que vos modules à être ouvert à révision après le déploiement, ou indépendamment déployable comme précompilés plugins (c'est à dire, dans le stockage des ressources d'une bibliothèque liée dynamiquement).
Donc voici mon explication des éléments importants de arxarian réponse:
engine.addImportPath("qrc:/");
est nécessaire dans le code C++ avant le chargement du qml pour instruire le moteur de chercher qml modules de l'application des ressources de stockage.RESOURCES += MyModule/mymodule.qrc
est nécessaire dans le projet (.pro) pour ajouter le fichier du module de fichiers à la demande de ressources de stockage.QML_IMPORT_PATH += $$PWD
dans le fichier de projet raconte Qt Creator de regarder pour le module à partir de la racine de la source du projet de l'arbre. Dans mon cas, j'ai dû pour cela définir un sous-répertoire (par exemple, "ui/modules") parce que mon module répertoires commencé. Le chemin d'importation devrait inclure la racine(s), sous tous les répertoires de modules. Aussi loin que je peux dire, cette instruction est uniquement pour l'IDE Qt Creator et n'a pas d'impact de la construction - c'est pourquoi #1 est nécessaire.<qresource prefix="/MyModule">
dans le module .qrc fichier définit le module de sous-répertoire par rapport à la scfq:/racine dans l'application des ressources de stockage.import MyModule <version>
déclaration en qml est maintenant configuré pour le succès. Au démarrage, le moteur sera situé le module dans son répertoire sous la scfq:/, analysé le qmldir fichier pour définir le module et créé le nom et la version de ces entrées.J'espère que cela aide les autres à comprendre ce qu'il se passe, et s'il vous plaît laissez-moi savoir si j'ai mal compris quelque chose.
J'ai eu le même problème et ont maintenant résolu. J'ai trouvé un QML plugin pour iOS. Il ya plusieurs choses qui doivent être pris en charge de:
1. Le plugin fichier pro a besoin d'un plus:
2. Le QML plugin qmldir fichier a besoin d'une ligne comme ceci:
3 Le projet du client, fichier pro a besoin d'un plus comme ceci: