Construire un module QML réutilisable

L'exemple ci-dessous montre comment créer une bibliothèque qui expose C++ à QML. La structure du répertoire de l'exemple ressemble à ceci :

├── CMakeLists.txt
└── example
    └── mylib
        ├── CMakeLists.txt
        ├── mytype.cpp
        ├── mytype.h

Le fichier de niveau supérieur CMakeLists.txt effectue une configuration de base en utilisant qt_standard_project_setup, puis utilise add_subdirectory pour inclure celui qui se trouve dans mylib :

cmake_minimum_required(VERSION 3.16)

project(qmlmodule VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Qml)
qt_standard_project_setup(REQUIRES 6.5)

add_subdirectory(example/mylib)

Les sous-répertoires sont structurés de manière à correspondre à l'URI du module QML, mais les points sont remplacés par des barres obliques. C'est la même logique que le moteur utilise lorsqu'il recherche un module dans les chemins d'importation. Le respect de cette structure de sous-répertoire facilite l'utilisation de l'outil.

mytype.h déclare une classe et utilise les macros d'enregistrement déclaratives pour l'exposer au moteur.

Dans le sous-répertoire CMakeLists.txt, nous appelons qt_add_qml_module. Par rapport à la construction d'une application QML, l'invocation est légèrement différente :

qt_add_qml_module(mylib
    URI example.mylib
    VERSION 1.0
    SOURCES
        mytype.h mytype.cpp
    QML_FILES
        MyQmlType.qml
)

La cible de mylib n'a pas été créée auparavant. Lorsque la cible passée à qt6_add_qml_module n'existe pas, elle crée automatiquement une cible de bibliothèque. Cela évite un appel séparé à qt_add_library. Pour enregistrer les types QML définis en C++, ajoutez leurs fichiers d'en-tête et de source comme arguments au paramètre SOURCES.

Lorsque le projet est construit, en plus de la bibliothèque, un plugin QML est également construit. La classe auto-générée du plugin s'étend à partir de QQmlEngineExtensionPlugin. La bibliothèque mylib elle-même contient déjà le code pour enregistrer les types avec le moteur. Cependant, cela n'est utile que dans les cas où nous pouvons établir un lien avec la bibliothèque. Pour rendre le module utilisable dans un fichier QML chargé par qml, l'outilQML Runtime , il faut un plugin qui peut être chargé. Le plugin est alors responsable de l'édition de liens avec la bibliothèque et de l'enregistrement des types.

Notez que la génération automatique du plugin n'est possible que si le module ne fait rien d'autre que d'enregistrer les types. S'il a besoin de faire quelque chose de plus avancé comme enregistrer un fournisseur d'image dans initializeEngine, vous devez toujours écrire manuellement le plugin. qt6_add_qml_module a un support pour cela avec NO_GENERATE_PLUGIN_SOURCE.

Par ailleurs, le respect de la convention de présentation des répertoires facilite l'utilisation de l'outil. Cette disposition est reflétée dans le répertoire de construction. Cela signifie que vous pouvez passer le chemin de votre répertoire de construction à l'outil QML (via le drapeau -I ), et il trouvera le plugin.

© 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.