Bereitstellung von QML-Anwendungen
QML-Dokumente werden von der QML Runtime geladen und ausgeführt. Dies beinhaltet die Declarative UI Engine zusammen mit den eingebauten QML-Typen und Plugin-Modulen. Die QML Runtime bietet auch Zugriff auf QML-Typen und -Module von Drittanbietern.
Anwendungen, die QML verwenden, müssen die QML Runtime aufrufen, um QML-Dokumente auszuführen. Sie können dies tun, indem Sie eine QQuickView oder eine QQmlEngine erstellen, wie unten beschrieben. Darüber hinaus enthält das Declarative UI-Paket das Tool qml
, das .qml
Dateien lädt. Dieses Tool ist nützlich, um QML-Code zu entwickeln und zu testen, ohne eine C++-Anwendung zum Laden der QML-Runtime schreiben zu müssen.
Bereitstellen von Anwendungen mit Qt Creator
Qt Creator stellt QML-Anwendungen auf verschiedenen Plattformen bereit und verpackt sie. Für mobile Geräte kann Qt Creator Anwendungen direkt in die jeweiligen Plattform-Paketformate, wie z. B. APK, bündeln.
Wenn Sie Ihre Anwendungen auf der Zielplattform ausführen, muss Ihre Anwendung auf den Speicherort der QML-Bibliotheken zugreifen. Wenn Sie qmake verwenden, zeigt die Umgebungsvariable QT_INSTALL_QML
auf den Speicherort der Bibliotheken. Die Qt-Installer installieren die QML-Bibliotheken im folgenden Verzeichnis: <version>
/
<compiler>/qml
.
QML-Zwischenspeicherung
Die QML Runtime lädt QML-Dokumente, indem sie sie parst und Bytecode erzeugt. In den meisten Fällen hat sich das Dokument seit dem letzten Laden nicht verändert. Um diesen Ladevorgang zu beschleunigen, unterhält die QML Runtime eine Cache-Datei für jedes QML-Dokument. Diese Cachedatei enthält den kompilierten Bytecode und eine binäre Darstellung der QML-Dokumentenstruktur. Wenn mehrere Anwendungen dasselbe QML-Dokument verwenden, wird außerdem der für den Code benötigte Speicher von den Anwendungsprozessen gemeinsam genutzt. Die Cache-Dateien werden über den Systemaufruf mmap()
auf POSIX-kompatiblen Betriebssystemen oder CreateFileMapping()
auf Windows geladen, was zu erheblichen Speichereinsparungen führt.
Jedes Mal, wenn Sie ein geändertes QML-Dokument laden, wird der Cache automatisch neu erstellt. Die Cache-Dateien befinden sich in einem Unterverzeichnis von QStandardPaths::CacheLocation mit dem Namen "qmlcache". Die Dateierweiterung lautet .qmlc
für QML-Dokumente und .jsc
für importierte JavaScript-Module.
Ahead-of-Time-Kompilierung
Die automatische Zwischenspeicherung von kompilierten QML-Dokumenten in Cache-Dateien führt zu einer deutlich schnelleren Ladezeit der Anwendung. Die anfängliche Erstellung von Cache-Dateien kann jedoch immer noch Zeit in Anspruch nehmen, insbesondere wenn die Anwendung zum ersten Mal gestartet wird. Um diesen anfänglichen Schritt zu vermeiden und von Anfang an schnellere Startzeiten zu erreichen, ermöglicht das Build-System von Qt, den Kompilierungsschritt für QML-Dateien bereits bei der Kompilierung der C++-Teile Ihrer Anwendung durchzuführen.
Ein Vorteil des Kompilierens im Voraus ist, dass Sie im Falle von Syntaxfehlern in Ihren QML-Dokumenten bereits bei der Kompilierung der Anwendung benachrichtigt werden und nicht erst zur Laufzeit, wenn die Datei geladen wird.
Dies geschieht automatisch, wenn Sie die CMake QML Module API verwenden; zu qmake siehe den folgenden Abschnitt.
qmake
Wenn Sie qmake verwenden, müssen Sie die Dateien und das Build-System auf eine bestimmte Art und Weise organisieren, um Ihre Anwendung mit im Voraus kompilierten QML-Dateien bereitzustellen:
- Alle QML-Dokumente (einschließlich JavaScript-Dateien) müssen als Ressourcen über das Qt-Ressourcensystem eingebunden werden.
- Ihre Anwendung muss die QML-Dokumente über das
qrc:///
URL-Schema laden. - Sie können die Ahead-of-Time-Kompilierung mit der Direktive
CONFIG+=qtquickcompiler
aktivieren.
Prototyping mit QML-Szene
Das Declarative UI-Paket enthält ein QML Runtime Tool, qml, das QML-Dokumente lädt und anzeigt. Dies ist in der Phase der Anwendungsentwicklung für das Prototyping von QML-basierten Anwendungen nützlich, ohne dass Sie Ihre eigenen C++-Anwendungen schreiben müssen, um die QML-Runtime aufzurufen.
Initialisierung der QML Runtime in Anwendungen
Um eine Anwendung auszuführen, die QML verwendet, muss Ihre Anwendung die QML Runtime aufrufen. Dies geschieht durch das Schreiben einer Qt C++-Anwendung, die die QQmlEngine lädt, indem sie entweder:
- Laden der QML-Datei über eine QQuickView -Instanz.
- Erstellen einer QQmlEngine -Instanz und Laden von QML-Dateien mit QQmlComponent.
Initialisierung mit QQuickView
QQuickView ist eine QWindow-basierte Klasse, die QML-Dateien laden kann. Wenn zum Beispiel eine QML-Datei, application.qml
, vorhanden ist, sieht sie wie folgt aus:
import QtQuick Rectangle { width: 100; height: 100; color: "red" }
Sie kann wie folgt in die main.cpp
Datei einer Qt-Anwendung geladen werden:
#include <QGuiApplication> #include <QQuickView> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQuickView view; view.setSource(QUrl::fromLocalFile("application.qml")); view.show(); return app.exec(); }
Dies erzeugt eine QWindow-basierte Ansicht, die den Inhalt von application.qml
anzeigt.
Build-Dateien
Verwenden Sie den Befehl find_package()
, um die benötigte Modulkomponente im Paket Qt6
zu finden:
find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
Weitere Details finden Sie in der Übersicht Bauen mit CMake.
Um das Modul für die Erstellung mit qmake zu konfigurieren, fügen Sie das Modul als Wert der Variable QT
in der .pro-Datei des Projekts hinzu:
QT += quick
Weitere Informationen finden Sie unter Erstellen von Projektdateien.
Direktes Erstellen einer QQmlEngine
Wenn application.qml
keine grafischen Komponenten hat, oder wenn es aus anderen Gründen vorgezogen wird, QQuickView zu vermeiden, kann QQmlEngine stattdessen direkt erstellt werden. In diesem Fall wird application.qml
als eine QQmlComponent Instanz geladen und nicht in eine Ansicht platziert:
#include <QGuiApplication> #include <QQmlEngine> #include <QQmlContext> #include <QQmlComponent> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlEngine engine; QQmlContext *objectContext = new QQmlContext(engine.rootContext()); QQmlComponent component(&engine, "application.qml"); QObject *object = component.create(objectContext); // ... delete object and objectContext when necessary return app.exec(); }
Wenn Sie keine grafischen Elemente von Qt Quick verwenden, können Sie QGuiApplication im obigen Code durch QCoreApplication ersetzen. Auf diese Weise können Sie QML als Sprache ohne jegliche Abhängigkeiten zum Qt GUI Modul.
Verwendung des Qt Resource Systems mit QML
Das Qt-Ressourcensystem ermöglicht die Speicherung von Ressourcendateien als Binärdateien in einer ausführbaren Anwendung. Das Qt-Ressourcensystem wird für QML-Anwendungen verwendet, da es ermöglicht, dass auf QML-Dateien und andere Ressourcen - wie Bilder und Sounddateien - über das URI-Schema des Ressourcensystems und nicht über relative oder absolute Pfade zu Dateisystemressourcen verwiesen wird.
Hinweis: Die Verwendung des Ressourcensystems bedeutet, dass die ausführbare Anwendung normalerweise neu kompiliert werden muss, wenn eine QML-Quelldatei geändert wird, um die Ressourcen im Paket zu aktualisieren.
Die CMake QML-Modul-API legt Ihre QML-Dateien automatisch im Ressourcensystem ab. Um auf sie zuzugreifen, laden Sie Ihre QML-Hauptdatei als Ressource oder als URL mit dem Schema qrc
. Der Pfad im Ressourcensystem, in dem Ihre QML-Dateien abgelegt sind, kann durch Verkettung ermittelt werden:
- die
RESOURCE_PREFIX
, die Sie an qt_add_qml_module übergeben haben. /qt/qml
Wenn SieRESOURCE_PREFIX
nicht an qt_add_qml_module übergeben haben und die QTP0001-Richtlinie aufNEW
gesetzt ist./
wenn SieRESOURCE_PREFIX
nicht an qt_add_qml_module übergeben haben und die QTP0001-Richtlinienot
aufNEW
gesetzt ist.- Wenn Sie
NO_RESOURCE_TARGET_PATH
nicht an qt_add_qml_module übergeben haben: dieURI
, die Sie an qt_add_qml_module übergeben haben, wobei Punkte durch Schrägstriche ersetzt werden.
Zum Beispiel wird ein Modul mit dem Namen My.Own.Module
an folgender Stelle platziert:
:/qt/qml/My/Own/Module/
wenn Sie/qt/qml
alsRESOURCE_PREFIX
angegeben haben, oder wenn SieRESOURCE_PREFIX
nicht übergeben haben und die QTP0001-Richtlinie aufNEW
gesetzt ist.:/My/Own/Module/
wenn Sie/
alsRESOURCE_PREFIX
angegeben haben, oder wenn SieRESOURCE_PREFIX
nicht bestanden haben und die QTP0001-Richtlinie nicht aufNEW
eingestellt ist. }:/Some/Prefix/My/Own/Module/
wenn SieSome/Prefix/
angegeben haben alsRESOURCE_PREFIX
:/
wenn Sie angegeben habenNO_RESOURCE_TARGET_PATH
Sobald dies geschehen ist, werden alle Dateien, die durch relative Pfade in QML angegeben sind, aus dem Ressourcensystem geladen. Die Verwendung des Ressourcensystems ist für die QML-Schicht völlig transparent; das bedeutet, dass der gesamte QML-Code auf Ressourcendateien unter Verwendung relativer Pfade verweisen sollte und nicht das qrc
-Schema verwenden sollte. Dieses Schema sollte nur von C++-Code verwendet werden, um auf Ressourcendateien zu verweisen.
Hinweis: Wenn Sie qmake verwenden, müssen Sie Ihre Dateien manuell im Ressourcensystem platzieren. Wie das geht, steht im qmake-Handbuch und in der allgemeinen Dokumentation zum Ressourcensystem. Es ist ratsam, die oben beschriebene Konvention zur Pfadbenennung zu befolgen.
Verwandte Informationen
© 2025 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.