Auf dieser Seite

QML-Skript-Compiler

Der QML-Skript-Compiler kompiliert Funktionen und Ausdrücke in QML- und JavaScript-Dateien zu einem Bytecode, der von der QML-Engine interpretiert oder Just-in-Time kompiliert werden kann.

Darüber hinaus kompiliert er einige Funktionen und Ausdrücke in QML-Dateien in C++-Code, wobei die durch die Eigenschaften von JavaScript vorgegebenen Einschränkungen zu beachten sind. Er generiert C++-Code für Funktionen, die vollständig analysiert werden können. Das folgende Flussdiagramm erläutert den Kompilierungsablauf.

Das Flussdiagramm zeigt die Kompilierungsschemata

Der QML-Skript-Compiler ist in zwei Versionen verfügbar. Die eine ist „qmlcachegen“, das Teil des „Qt Quick -Compilers“ ist. Die andere ist „qmlsc“, das Teil des ausschließlich kommerziell erhältlichen Add-ons „Qt Quick -Compiler-Erweiterungen“ ist.

qmlcachegen

qmlcachegen nutzt das Metaobjektsystem, generiert Lookups und speichert diese an einem zentralen Ort, einer Kompilierungseinheit. Die Kompilierungseinheit enthält eine Darstellung der Dokumentstruktur, eine kompakte Bytecode-Darstellung für jede Funktion und jeden Ausdruck sowie nativen Code für Funktionen und Bindungen, den der Compiler vollständig versteht. Der Bytecode in einer Kompilierungseinheit kann von der QML-Engine verwendet werden, um eine Neukompilierung zu vermeiden und die Ausführung zu beschleunigen.

qmlsc

qmlsc hingegen erweitert die Grundfunktionalität von qmlcachegen um zwei zusätzliche Modi.

Statischer Modus

Im statischen Modus geht qmlsc davon aus, dass keine für C++ exponierten Eigenschaften beliebiger Typen durch abgeleitete Typen überschattet werden können. Dadurch entfällt der Mechanismus zur Überprüfung auf Überschattung, sodass mehr JavaScript-Code nach C++ kompiliert werden kann, was letztendlich zu schnellerem Code führt.

Um den statischen Modus in qmlsc zu aktivieren, sollten Sie „ --static “ über „ QT_QMLCACHEGEN_ARGUMENTS “ an „qt_add_qml_module“ übergeben.

qt_add_qml_module(someTarget
...
)

set_target_properties(someTarget PROPERTIES
    QT_QMLCACHEGEN_ARGUMENTS "--static"
)

Warnung: Der statische Modusvon qmlsc erzeugt ungültigen Code, wenn im QML-Dokument Eigenschaften überschattet werden.

Direktmodus

Im Direktmodus geht qmlsc davon aus, dass alle in Ihrem QML-Code verwendeten C++-Typen verfügbar sind und als C++-Header in den generierten Code eingebunden werden können. Der generierte Code greift dann auf Eigenschaften zu oder ändert sie, indem er Getter, Setter und aufrufbare Funktionen in diesen Header-Dateien direkt aufruft, was die Ausführung noch weiter beschleunigt. Das bedeutet, dass Sie in CMake auf private Qt-APIs verweisen müssen.

Warnung: Private Qt-APIs ändern sich häufig. Sie müssen Qt für jede neue Version neu kompilieren.

Warnung: Wenn ein Typ nur in einem Plugin definiert ist oder keinen Header hat, kannst du ihn im Direktmodus nicht verwenden.

Um den Direktmodus zu aktivieren, solltest du Folgendes beachten:

  • Sie sollten „ --direct-calls “ über „ QT_QMLCACHEGEN_ARGUMENTS “ an „qt_add_qml_module“ übergeben.
    qt_add_qml_module(someTarget
    ...
    )
    
    set_target_properties(someTarget PROPERTIES
        QT_QMLCACHEGEN_ARGUMENTS "--direct-calls"
    )
  • Verlinken Sie alle relevanten privaten Qt-Module anstelle ihrer öffentlichen Entsprechungen.
    find_package(Qt6 COMPONENTS QmlPrivate QuickPrivate)
    
    qt_add_qml_module(someTarget
    ...
    )
    
    target_link_libraries(someTarget PRIVATE
        Qt::QmlPrivate
        Qt::QuickPrivate
        ...
    )
  • Legen Sie „ PLUGIN_TARGET “ nicht so fest, dass es mit dem Ziel der zugrunde liegenden Bibliothek übereinstimmt.
    # direct mode will not function in this setup.
    qt_add_qml_module(someTarget
    PLUGIN_TARGET someTarget
    ...
    )

Einschränkungen beim Kompilieren von JavaScript nach C++

Viele JavaScript-Konstrukte lassen sich in C++ nicht effizient darstellen. Der QML-Skript-Compiler überspringt die C++-Codegenerierung für Funktionen, die solche Konstrukte enthalten, und generiert lediglich Bytecode, der interpretiert oder über den Just-in-Time-Compiler ausgeführt wird. Die meisten gängigen QML-Ausdrücke sind recht einfach: Wertabfragen bei QObjects, arithmetische Operationen, einfache if/else- oder Schleifenkonstrukte. Diese lassen sich problemlos in C++ ausdrücken, wodurch Ihre Anwendung schneller läuft.

Statistiken zur Kompilierung von Funktionen und Bindungen abrufen

Der QML-Skript-Compiler zeichnet beim Kompilieren von QML in C++ Statistiken auf. Diese können Einblicke in die Kompilierung von Funktionen und Bindungen geben. Dazu gehören die Dauer der Kompilierung, die Angabe, ob sie erfolgreich war, und – falls nicht – die Angabe des Fehlers, der zum Fehlschlagen geführt hat. Zusätzlich zur Darstellung dieser Ergebnisse pro Bindung oder Funktion werden die Statistiken auch pro Datei, pro Modul und auf Projektebene zusammengefasst. Dies kann einen schnellen Überblick darüber geben, wie gut ein Projekt kompiliert wird.

Um die Statistiken anzuzeigen, rufen Sie das CMake-Target „all_aotstats“ auf.

Die Erfassung von Kompilierungsstatistiken ist standardmäßig aktiviert. Um sie zu deaktivieren, setzen Sie die CMake-Variable „QT_QML_GENERATE_AOTSTATS“ vor dem ersten Aufruf von „qt_add_qml_module“ auf „OFF“.

Hinweis: Diese Statistiken sind nur für Module verfügbar, die über die CMake-API ` qt_add_qml_module ` registriert wurden.

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