Intégration de l'ensemble avec CMake
La commande CMake `qt_add_qml_module ` est la méthode recommandée pour définir des modules QML. Elle automatise l'enregistrement des types, l'intégration des ressources, la création de plugins et l'intégration des outils. Cette page explique les concepts sous-jacents à ` qt_add_qml_module ` et présente les cas d'utilisation courants.
Pour une référence complète de toutes les options, consultez qt_add_qml_module.
Concepts clés
Avant d’examiner les exemples, il est utile de comprendre ce que qt_add_qml_module crée réellement :
- Une cible de support — une bibliothèque (ou un exécutable) contenant le code C++ du module, les fichiers QML compilés et les ressources. Il s’agit du premier argument de `
qt_add_qml_module` et c’est la cible à laquelle vous effectuez la liaison. Il peut s’agir soit d’une cible existante (créée précédemment avec `qt_add_executable` ou `qt_add_library`), soit d’une cible que `qt_add_qml_module` créera pour vous. - Une cible « plugin »: une petite bibliothèque qui permet au moteur QML de charger le module de manière dynamique lors de l’exécution. Elle est créée automatiquement et est distincte de la cible « backing ». Lorsqu’un exécutable est lié directement à la cible « backing », le plugin n’est pas chargé lors de l’exécution. Le plugin peut être entièrement omis à l’aide de NO_PLUGIN.
- Un fichier qmldir — un fichier de métadonnées du module qui indique au moteur QML quels types le module fournit et où les trouver. Il est généré automatiquement.
- Un fichier typeinfo (
.qmltypes) — des informations de type lisibles par machine utilisées par les outils QML (qmlcachegen, qmllint, qmlls, Qt Creator). Également généré automatiquement.
Structure des répertoires
La structure du répertoire source doit refléter l’URI du module. L’URI est converti en chemin d’accès en remplaçant les points par des barres obliques. Par exemple, un module dont l’URI est MyCompany.Controls doit se trouver dans :
src/MyCompany/Controls/CMakeLists.txt
src/MyCompany/Controls/Button.qml
src/MyCompany/Controls/mywidget.cpp
src/MyCompany/Controls/mywidget.hCette convention permet au moteur QML et aux outils de localiser les modules sans configuration supplémentaire. Si votre structure de répertoires ne correspond pas à l’URI, vous devrez définir OUTPUT_DIRECTORY afin que le résultat de la compilation soit placé dans un chemin correspondant à l’URI, et IMPORT_PATH afin que le moteur QML et les outils puissent localiser le module.
Modèles courants
Application exclusivement en QML
Le cas le plus simple : un exécutable contenant uniquement des fichiers QML et aucun type C++.
cmake_minimum_required(VERSION 3.16)
project(myapp LANGUAGES CXX)
find_package(Qt6 REQUIRED COMPONENTS Quick)
qt_standard_project_setup(REQUIRES 6.8)
qt_add_executable(myapp)
qt_add_qml_module(myapp
URI MyApp
QML_FILES
Main.qml
Button.qml
RESOURCES
images/logo.png
)
target_link_libraries(myapp PRIVATE Qt6::Quick)La cible sous-jacente étant un exécutable, aucun plugin n’est créé. Les fichiers QML sont compilés et intégrés en tant que ressources. Le mot-clé ` RESOURCES ` ajoute les fichiers non-QML (images, polices, etc.) à la même hiérarchie de ressources.
Application avec des types C++
Une application qui expose des types C++ à QML :
qt_add_executable(myapp)
qt_add_qml_module(myapp
URI MyApp
QML_FILES
Main.qml
SOURCES
backend.cpp backend.h
)Les types C++ dans ` backend.h ` doivent être annotés avec ` QML_ELEMENT ` (ou des macros similaires telles que ` QML_NAMED_ELEMENT`) et doivent utiliser la macro ` Q_OBJECT ` ou ` Q_GADGET `. L’enregistrement des types s’effectue automatiquement via ` AUTOMOC`. Consultez la section « Enregistrement des types C++ avec le système de types QML » pour un aperçu complet des macros d’enregistrement disponibles.
Module de bibliothèque réutilisable
Un module QML packagé sous forme de bibliothèque que d’autres projets ou modules peuvent importer :
# In src/MyCompany/Controls/CMakeLists.txt
qt_add_qml_module(mycontrols
URI MyCompany.Controls
QML_FILES
Button.qml
Slider.qml
SOURCES
theme.cpp theme.h
)Cela crée deux cibles : mycontrols (la bibliothèque de base) et mycontrolsplugin (le plugin). Les autres modules l’importent à l’aide de ` import MyCompany.Controls ` en QML. Les applications qui se lient directement à ` mycontrols ` n’ont pas besoin de charger le plugin au moment de l’exécution.
Application utilisant un module de bibliothèque
Utilisation du module mycontrols issu de l’exemple de module de bibliothèque réutilisable ci-dessus :
# In the application's CMakeLists.txt
qt_add_executable(myapp)
qt_add_qml_module(myapp
URI MyApp
QML_FILES Main.qml
DEPENDENCIES TARGET mycontrols
)
target_link_libraries(myapp PRIVATE mycontrols)La ligne DEPENDENCIES garantit que les outils QML (qmlcachegen, qmllint, qmlls) peuvent trouver les types fournis par MyCompany.Controls.
// In Main.qml
import MyCompany.Controls
Button { text: "Click me" }Module avec des singletons
Les fichiers QML fournissant des types singleton nécessitent qu’une propriété de fichier source soit définie avant l’appel à ` qt_add_qml_module ` :
set_source_files_properties(Theme.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
qt_add_qml_module(mymodule
URI MyModule
QML_FILES
Theme.qml
Main.qml
)Le fichier QML doit également contenir pragma Singleton. La propriété CMake et le pragma QML sont tous deux obligatoires.
Module avec plugin personnalisé
Lorsque vous devez effectuer une initialisation personnalisée (par exemple, l’enregistrement d’un fournisseur d’images), vous pouvez fournir votre propre sous-classe de ` QQmlEngineExtensionPlugin `.
# In CMakeLists.txt
qt_add_qml_module(mymodule
URI MyModule
NO_GENERATE_PLUGIN_SOURCE
NO_PLUGIN_OPTIONAL
CLASS_NAME MyModulePlugin
QML_FILES
Main.qml
SOURCES
myimageprovider.cpp myimageprovider.h
)
# Add the custom plugin source to the plugin target
target_sources(mymoduleplugin PRIVATE plugin.cpp)// In plugin.cpp
#include <QtQml/QQmlEngineExtensionPlugin>
#include "myimageprovider.h"
class MyModulePlugin : public QQmlEngineExtensionPlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid)
public:
void initializeEngine(QQmlEngine *engine, const char *uri) override
{
engine->addImageProvider("myprovider", new MyImageProvider);
}
};
#include "plugin.moc"NO_GENERATE_PLUGIN_SOURCE indique au système de compilation de ne pas générer le code source par défaut du plugin. CLASS_NAME doit correspondre au nom de la classe dans votre implémentation. NO_PLUGIN_OPTIONAL garantit que le plugin est toujours chargé, car il contient une logique d’initialisation qui serait sinon ignorée.
Ajout de fichiers QML supplémentaires
Pour les fichiers QML ajoutés après l’appel initial à ` qt_add_qml_module `, utilisez ` qt_target_qml_sources` :
qt_target_qml_sources(my_qml_module
QML_FILES
DynamicallyAddedType.qml
)Cela est utile pour inclure des fichiers de manière conditionnelle en fonction de la plateforme ou de la configuration.
Référence détaillée de CMake
Pour plus de détails sur toutes les commandes, propriétés, variables et politiques CMake, consultez la section Intégration de CMake pour QML.
Voir également Modules QML, qt_add_qml_module et Écriture de modules QML.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.