QMLアプリケーションのデプロイ
QMLドキュメントはQMLランタイムによって読み込まれ、実行されます。これには、組み込みのQML型やプラグインモジュールに加え、Declarative UIエンジンが含まれます。QMLランタイムは、サードパーティの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 のリソースシステム経由でリソースとしてインクルードする必要があります。
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のグラフィカルアイテムを使わない場合は、上記のコードでQGuiApplication をQCoreApplication に置き換えることができます。こうすることで、Qt GUIモジュールに依存することなく、QMLを言語として使うことができます。
QMLでQtリソースシステムを使う
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 リソースシステム
©2024 The Qt Company Ltd. ここに含まれるドキュメントの著作権はそれぞれの所有者に帰属します。 ここで提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。