Erstellen eines wiederverwendbaren QML-Moduls
Das folgende Beispiel zeigt, wie man eine Bibliothek erstellt, die C++ für QML verfügbar macht. Die Verzeichnisstruktur für das Beispiel sieht wie folgt aus:
├── CMakeLists.txt
└── example
└── mylib
├── CMakeLists.txt
├── mytype.cpp
├── mytype.hDie Datei „ CMakeLists.txt “ auf oberster Ebene führt mit `qt_standard_project_setup()` einige grundlegende Einrichtungsschritte durch und bindet anschließend mit ` add_subdirectory ` das Modul in „mylib“ ein:
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)Die Unterverzeichnisse sind so strukturiert, dass sie der URI des QML-Moduls entsprechen, wobei die Punkte jedoch durch Schrägstriche ersetzt wurden. Dies entspricht der Logik, die die Engine verwendet, wenn sie in den Importpfaden nach einem Modul sucht. Die Einhaltung dieser Unterverzeichnisstruktur erleichtert die Arbeit mit den Entwicklungstools.
mytype.h deklariert eine Klasse und nutzt die deklarativen Registrierungsmakros, um sie der Engine zugänglich zu machen.
In der Datei „ CMakeLists.txt “ des Unterverzeichnisses rufen wir `qt_add_qml_module()` auf. Im Vergleich zu „Erstellen einer QML-Anwendung“ unterscheidet sich der Aufruf geringfügig:
qt_add_qml_module(mylib
URI example.mylib
VERSION 1.0
SOURCES
mytype.h mytype.cpp
QML_FILES
MyQmlType.qml
)Das Ziel für „ mylib “ wurde zuvor noch nicht erstellt. Wenn das an „ qt6_add_qml_module “ übergebene Ziel nicht existiert, wird automatisch ein Bibliotheksziel erstellt. Dadurch wird ein separater Aufruf von „qt_add_library()“ vermieden. Um in C++ definierte QML-Typen zu registrieren, fügen Sie deren Header- und Quelldateien als Argumente zum Parameter „SOURCES“ hinzu.
Beim Erstellen des Projekts wird zusätzlich zur Bibliothek auch ein QML-Plugin erstellt. Die automatisch generierte Klasse des Plugins erbt von ` QQmlEngineExtensionPlugin`. Die Bibliothek `mylib` selbst enthält bereits den Code zur Registrierung der Typen bei der Engine. Dies ist jedoch nur in Fällen sinnvoll, in denen wir gegen die Bibliothek verknüpfen können. Damit das Modul in einer QML-Datei verwendet werden kann, die von „ qml “ – dem „QML Runtime “-Tool – geladen wird, ist ein Plugin erforderlich, das geladen werden kann. Das Plugin ist dann dafür zuständig, die Bibliothek tatsächlich einzubinden und sicherzustellen, dass die Typen registriert werden.
Beachten Sie, dass die automatische Plugin-Generierung nur möglich ist, wenn das Modul nichts anderes tut als die Typen zu registrieren. Wenn es etwas Fortgeschritteneres tun muss, wie beispielsweise die Registrierung eines Bildanbieters in initializeEngine, müssen Sie das Plugin weiterhin manuell schreiben. qt_add_qml_module() bietet hierfür Unterstützung mit NO_GENERATE_PLUGIN_SOURCE.
Außerdem erleichtert die Einhaltung der Konventionen für die Verzeichnisstruktur die Arbeit mit den Tools. Diese Struktur spiegelt sich im Build-Verzeichnis wider. Das bedeutet, dass Sie den Pfad zu Ihrem Build-Verzeichnis an das QML-Tool übergeben können (über das Flag ` -I `), und es wird das Plugin finden.
© 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.