QMLアプリケーションのデプロイ
QMLドキュメントはQMLランタイムによって読み込まれ、実行されます。これには、組み込みのQMLタイプやプラグインモジュールに加え、Declarative UIエンジンが含まれます。QMLランタイムは、サードパーティのQMLタイプやモジュールへのアクセスも提供します。
QMLを使用するアプリケーションは、QMLドキュメントを実行するためにQMLランタイムを呼び出す必要があります。そのためには、後述するQQuickView やQQmlEngine を作成する必要があります。さらに、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 の Resource システム経由でリソースとしてインクルードする必要があります。
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ファイルを読み込むことができるQWindow ベースのクラスです。例えば、application.qml
という 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 のグラフィカルアイテムを使用しない場合は、上記のコードでQGuiApplication をQCoreApplication に置き換えることができます。このようにすることで、モジュールに依存することなく、QMLを言語として使用することができます。 Qt GUIモジュールに依存することなく、QMLを言語として使うことができます。
QtリソースシステムとQMLの併用
Qtリソースシステムでは、リソースファイルをバイナリファイルとしてアプリケーション実行ファイルに格納することができます。Qtリソースシステムは、QMLファイルや、画像やサウンドファイルなどのリソースを、ファイルシステムリソースへの相対パスや絶対パスではなく、リソースシステムのURIスキームを通して参照することができるため、QMLアプリケーションに使用されます。
注意: リソースシステムを使用するということは、QML のソースファイルが変更されるたびに、パッケージ内のリソースを更新するために、アプリケーションの実行ファイルを再コンパイルしなければならないことを意味します。
CMake QML Module APIは、QML ファイルを自動的にリソースシステムに配置します。これらのファイルにアクセスするには、メインの QML ファイルをリソースとしてロードするか、qrc
スキームの URL としてロードします。QML ファイルが配置されるリソースシステム内のパスは、次のように連結することで 求めることができます:
- qt_add_qml_moduleに渡した
RESOURCE_PREFIX
。 /qt/qml
qt_add_qml_moduleにRESOURCE_PREFIX
を渡しておらず、QTP0001ポリシーがNEW
に設定されている場合。/
qt_add_qml_moduleにRESOURCE_PREFIX
を渡しておらず、QTP0001 のポリシーがnot
でNEW
に設定されている場合。- qt_add_qml_module に
NO_RESOURCE_TARGET_PATH
を渡していない場合:qt_add_qml_moduleに渡したURI
のドットをスラッシュに置き換えたもの。
例えば、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.