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アプリケーションを様々なプラットフォームに配備し、パッケージ化することができます。モバイル機器向けには、 、アプリケーションを APK などの各プラットフォームのパッケージ形式に直接バンドルすることができます。Qt Creator
ターゲットプラットフォーム上でアプリケーションを実行する際、アプリケーションは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 のグラフィカルアイテムを使用しない場合は、上記のコードで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マニュアルとリソースシステムに関する一般的なドキュメントを参照してください。この場合でも、上で説明したパスの命名規則に従うことをお勧めします。
関連情報
- Qt アプリケーションのデプロイ
- 複数のプラットフォームで実行する
- デバイスへのデプロイ
- qtqml-cppintegration-exposecppattributes.html{Exposing Attributes of C++ Types to QML}{C++型の属性をQMLに公開する}.
- Qt リソースシステム
© 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.