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:

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:

Zum Beispiel wird ein Modul mit dem Namen My.Own.Module an folgender Stelle platziert:

  • :/qt/qml/My/Own/Module/ wenn Sie /qt/qml als RESOURCE_PREFIX angegeben haben, oder wenn Sie RESOURCE_PREFIX nicht übergeben haben und die QTP0001-Richtlinie auf NEW gesetzt ist.
  • :/My/Own/Module/ wenn Sie / als RESOURCE_PREFIX angegeben haben, oder wenn Sie RESOURCE_PREFIX nicht bestanden haben und die QTP0001-Richtlinie nicht auf NEW eingestellt ist. }
  • :/Some/Prefix/My/Own/Module/ wenn Sie Some/Prefix/ angegeben haben als RESOURCE_PREFIX
  • :/ wenn Sie angegeben haben NO_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.

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