QMLアプリケーションのデプロイ

QMLドキュメントはQMLランタイムによって読み込まれ、実行されます。これには、組み込みのQML型やプラグインモジュールに加え、Declarative UIエンジンが含まれます。QMLランタイムは、サードパーティのQML型やモジュールへのアクセスも提供します。

QMLを使用するアプリケーションは、QMLドキュメントを実行するためにQMLランタイムを呼び出す必要があります。そのためには、後述するQQuickViewQQmlEngine を作成する必要があります。さらに、Declarative UIパッケージには.qml ファイルをロードするqml ツールが含まれています。このツールは、QMLランタイムをロードするためのC++アプリケーションを作成することなく、QMLコードの開発やテストを行うのに便利です。

アプリケーションのデプロイQt Creator

Qt Creatorを使ってQMLアプリケーションを様々なプラットフォームに配備し、パッケージ化することができます。モバイル機器向けには、Qt Creator 、アプリケーションを APK などの各プラットフォームのパッケージ形式に直接バンドルすることができます。

ターゲットプラットフォーム上でアプリケーションを実行する際、アプリケーションはQMLライブラリの場所にアクセスする必要があります。qmake を使用する場合、QT_INSTALL_QML 環境変数がライブラリの場所を指し示します。Qt インストーラはQML ライブラリを<version>/<compiler>/qml ディレクトリにインストールします。

QML キャッシュ

QMLランタイムはQMLドキュメントをパースし、バイトコードを生成することでロードします。ほとんどの場合、ドキュメントは前回ロードされたときから変更されていません。この読み込み処理を高速化するために、QMLランタイムは各QMLドキュメントに対してキャッシュファイルを保持します。このキャッシュファイルには、コンパイルされたバイトコードとQMLドキュメント構造のバイナリ表現が含まれています。また、複数のアプリケーションが同じQMLドキュメントを使用する場合、コードに必要なメモリはアプリケーションプロセス間で共有されます。キャッシュファイルはPOSIX準拠のオペレーティングシステムではmmap() 、WindowsではCreateFileMapping() 、システムコールを介してロードされるため、大幅なメモリの節約につながります。

変更されたQML文書を読み込むたびに、キャッシュは自動的に再作成されます。キャッシュファイルはQStandardPaths::CacheLocation のサブディレクトリに "qmlcache" という名前で置かれます。ファイルの拡張子は QML ドキュメントが.qmlc で、インポートされた JavaScript モジュールが.jsc です。

先行コンパイル

コンパイルされたQMLドキュメントをキャッシュファイルに自動的にキャッシュすることで、アプリケーションのロード時間が大幅に短縮されます。しかし、キャッシュファイルの初期作成には、特にアプリケーションの初回起動時に時間がかかることがあります。Qt のビルドシステムでは、アプリケーションの C++ 部分をコンパイルする際に、QML ファイルのコンパイルを前もって行うことができます。

先にコンパイルを行う利点のひとつは、QML ドキュメントに構文エラーがあった場合に、ファイルがロードされるランタイムではなく、アプリケーションのコンパイル時に通知されることです。

CMakeのQMLモジュールAPIを使えば、このようなエラーは自動的に発生します。

qmake

qmake を使う場合、先にコンパイルした QML ファイルを使ってアプリケーションをデプロイするには、ファイルやビルドシステムを特定の方法で整理する必要があります:

  • すべての QML ドキュメント(JavaScript ファイルを含む)は、Qt のリソースシステム経由でリソースとしてインクルードする必要があります。
  • qrc:/// 全ての QML ドキュメント(JavaScript ファイルを含む)は、Qt の Resource システムを経由してリソースとしてインクルードされなければなりません。
  • CONFIG+=qtquickcompiler ディレクティブを使って、Ahead-of-Time コンパイルを有効にすることができます。

QML Sceneを使ったプロトタイピング

Declarative UIパッケージには、QMLドキュメントを読み込んで表示するQML Runtime ツールqmlが含まれています。これは、アプリケーションの開発段階で、QMLランタイムを呼び出すために独自のC++アプリケーションを書くことなく、QMLベースのアプリケーションをプロトタイピングするのに便利です。

アプリケーションにおけるQML Runtime の初期化

QMLを使ったアプリケーションを実行するためには、QMLランタイムを呼び出す 必要があります。これは、QQmlEngine をロードする Qt C++ アプリケーションを書くことで行います:

  • QQuickView インスタンスを通して QML ファイルをロードする。
  • QQmlEngine インスタンスを作成し、QQmlComponent で QML ファイルをロードする。

QQuickView による初期化

QQuickView は、QMLファイルを読み込むことができる ベースのクラスです。例えば、 というQMLファイルがあれば、次のようになります:QWindow application.qml

import QtQuick

Rectangle { width: 100; height: 100; color: "red" }

Qtアプリケーションのmain.cpp

#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();
}

これは、application.qml の内容を表示するQWindow ベースのビューを作成します。

ビルドファイル

.パッケージで必要なモジュールコンポーネントを見つける

find_package() コマンドを使って、Qt6 パッケージの中から必要なモジュール・コンポーネントを探します:

find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)

詳細については、CMakeによるビルドの概要を参照してください。

qmakeでビルドするためにモジュールを設定するには、プロジェクトの.proファイルにQT 変数の値としてモジュールを追加します:

QT += quick

詳細については、プロジェクトファイルの作成を参照してください。

QQmlEngineを直接作成する

application.qml にグラフィカルコンポーネントがない場合や、その他の理由でQQuickView を避けたい場合は、代わりにQQmlEngine を直接構築することができます。この場合、application.qml はビューに配置されるのではなく、QQmlComponent インスタンスとしてロードされます:

#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();
}

Qt Quick のグラフィカルアイテムを使用しない場合は、上記のコードでQGuiApplicationQCoreApplication に置き換えることができます。このようにすることで、モジュールに依存することなくQMLを言語として使うことができます。 Qt GUIモジュールに依存することなく、QMLを言語として使うことができます。

QtリソースシステムをQMLで使う

Qtリソースシステムでは、リソースファイルをバイナリファイルとしてアプリケーション実行ファイルに格納することができます。Qtリソースシステムは、QMLファイルやその他のリソース(画像やサウンドファイルなど)を、ファイルシステムリソースへの相対パスや絶対パスではなく、リソースシステムのURIスキームを通して参照することを可能にするため、QMLアプリケーションに使用されます。

注意: リソースシステムを使用するということは、QMLのソースファイルが変更されるたびに、パッケージ内のリソースを更新するために、アプリケーションの実行ファイルを再コンパイルしなければならないことを意味します。

CMake QML Module APIは、QML ファイルを自動的にリソースシステムに配置します。これらのファイルにアクセスするには、メインの QML ファイルをリソースとしてロードするか、qrc スキームの URL としてロードします。QML ファイルが配置されるリソースシステム内のパスは、次のように連結することで 求めることができます:

例えば、My.Own.Module というモジュールは次の場所に置かれます:

  • :/qt/qml/My/Own/Module/ /qt/qml を に指定した場合、または をRESOURCE_PREFIX RESOURCE_PREFIX 渡さずに QTP0001ポリシーを に設定した場合。NEW
  • :/My/Own/Module/ / を と指定した場合、または をパスしてRESOURCE_PREFIX RESOURCE_PREFIX おらずQTP0001ポリシーが に設定されてNEWいない場合。}
  • :/Some/Prefix/My/Own/Module/ として を指定した場合。Some/Prefix/ RESOURCE_PREFIX
  • :/ を指定した場合NO_RESOURCE_TARGET_PATH

このようにすると、QMLの相対パスで指定されたファイルはすべてリソースシステムから読み込まれます。リソースシステムの使用はQMLレイヤに対して完全に透過的です。つまり、QMLのコードはすべて相対パスでリソースファイルを参照し、qrc スキームを使用すべきではありません。このスキームはC++のコードからリソースファイルを参照する場合にのみ使用されます。

注意: qmakeを使用する場合、手動でファイルをリソースシステムに配置する必要があります。その方法については、qmakeマニュアルとリソースシステムに関する一般的なドキュメントを参照してください。この場合でも、上で説明したパスの命名規則に従うことをお勧めします。

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