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

QMLドキュメントはQMLランタイムによって読み込まれ、実行されます。これには、組み込みのQML型やプラグインモジュールに加え、Declarative UIエンジンが含まれます。QMLランタイムは、サードパーティの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ランタイムツールqmlが含まれています。これは、アプリケーションの開発段階において、QMLランタイムを呼び出すために独自のC++アプリケーションを書くことなく、QMLベースのアプリケーションをプロトタイピングするのに便利です。

アプリケーションにおけるQMLランタイムの初期化

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 ベースのビューを作成します。

ビルドファイル

qmake#tab-qmake.

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 に置き換えることができます。こうすることで、Qt GUIモジュールに依存することなく、QMLを言語として使うことができます。

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

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マニュアルとリソースシステムに関する一般的なドキュメントを参照してください。この場合でも、上で説明したパスの命名規則に従うことをお勧めします。

©2024 The Qt Company Ltd. ここに含まれるドキュメントの著作権はそれぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。