QML文書ディレクトリのインポート

QMLファイルのローカルディレクトリは、追加の設定や構成なしにインポートできます。リモートの QML ディレクトリもインポートできますが、qmldir ファイルが存在する必要があります。インポートするクライアントに提供する型名を定義したり、インポーターが利用できるようにする JavaScript リソースを指定するために、ローカルディレクトリにはqmldir ファイルを含めることができます。

ローカルディレクトリのインポート

ローカルファイルシステム上の QML ファイルは、ディレクトリの絶対パスまたは相対パスを参照する import 文を使用することで、ローカルディレクトリをインポートすることができます。

ローカルディレクトリにqmldir ファイルが存在する場合は、qmldir ファイルで指定された型名が使用可能になります。そうでない場合は、QML ドキュメントのファイル名から派生した型名が使用可能になります。それ以外の場合は、QML文書のファイル名に由来する型名で利用できるようになります。ディレクトリにqmldir ファイルが指定されていない場合は、大文字で始まり、".qml "で終わるファイル名のみが型として公開されます。

ディレクトリのインポートはモジュールのインポートよりも優先されます。同じ名前空間にインポートされたモジュールとディレクトリで同じ名前が定義されている場合、モジュールの型だけが利用可能になります。

次のようなQMLプロジェクトのディレクトリ構造を考えてみましょう。トップレベルのディレクトリmyapp の下に、mycomponents というサブディレクトリに共通の UI コンポーネントがあり、main というサブディレクトリにメインのアプリケーションコードがあります:

myapp
    |- mycomponents
        |- CheckBox.qml
        |- DialogBox.qml
        |- Slider.qml
    |- main
        |- application.qml

main/application.qml ファイルは、mycomponents ディレクトリを相対パスでインポートし、そのディレクトリ内で定義された QML オブジェクトタイプを使用することができます:

import "../mycomponents"

DialogBox {
    CheckBox {
        // ...
    }
    Slider {
        // ...
    }
}

この場合、そのディレクトリで定義されているQMLオブジェクトの型はすべて修飾されていなければなりません:

import "../mycomponents" as MyComponents

MyComponents.DialogBox {
    // ...
}

ローカルディレクトリをインポートする機能は、アプリケーション内のコンポーネントセットやアプリケーションのプロトタイピングのような場合に便利ですが、そのようなモジュールをインポートするコードは、モジュールディレクトリが別の場所に移動した場合、関連するimport ステートメントを更新しなければなりません。代わりにQMLモジュールを使えば、インストールされたモジュールはファイルシステムのパスではなく、一意な識別子文字列でインポートされるため、このような事態を避けることができます。

暗黙のインポート

QML文書が存在するディレクトリは自動的にインポートされます。"." などを明示的にインポートする必要はありません。

注意: QML文書が属するモジュールを指定するqmldirファイルがQML文書自身と同じディレクトリにあることを確認してください。そうでないと、暗黙のインポートが文書の属するモジュールと異なってしまいます。そうすると、例えば別のQML文書がモジュールのコンテキストではシングルトンであっても、暗黙のインポートのコンテキストではシングルトンでないことがあります。これはよくある間違いの原因です。

遠隔地にあるディレクトリ

QMLファイルのあるディレクトリが、qmldir

注意: これはQML文書が存在するディレクトリを暗黙的にインポートする場合にも当てはまります。QML文書がリモートの場所から読み込まれる場合は、たとえ明示的なディレクトリのインポート記述がなくても、qmldirファイルを追加する必要があります。そうしないと、QML文書がお互いに見えなくなってしまいます。

例えば、先ほどの例のmyapp ディレクトリが "http://www.my-example-server.com "でホストされており、mycomponents ディレクトリに以下のように定義されたqmldir ファイルがあったとします:

CheckBox CheckBox.qml
DialogBox DialogBox.qml
Slider Slider.qml

そして、このディレクトリは、リモートのmycomponents ディレクトリへのURLを使ってインポートすることができる:

import "http://www.my-example-server.com/myapp/mycomponents"

DialogBox {
    CheckBox {
        // ...
    }
    Slider {
        // ...
    }
}

ネットワーク経由でディレクトリをインポートする場合、そのディレクトリにあるqmldir ファイルで指定された QML ファイルと JavaScript ファイルにしかアクセスできないことに注意してください。

警告 リモートサーバからディレクトリをインポートする場合、開発者は悪意のあるコードを読み込まないように、信頼できるソースからのディレクトリのみを読み込むように常に注意する必要があります。

qmldirファイルのディレクトリ一覧

ディレクトリ一覧qmldir ファイルは、モジュール定義 qmldir ファイルとは明確に異なります。ディレクトリリストqmldir ファイルはQML文書群を迅速かつ容易に共有することを可能にしますが、 文書群によって定義されたQMLオブジェクト型を登録する型名前空間を定義したり、 QMLオブジェクト型のバージョン管理をサポートするものではありません。

ディレクトリリストqmldir ファイルのシンタックスは以下の通りです:

コマンド構文説明
オブジェクトタイプの宣言<TypeName> <FileNameオブジェクト型宣言により、QML文書を指定された<TypeName> で公開することができます。

RoundedButton RoundedBtn.qml
内部オブジェクト型宣言internal <型名> <ファイル名内部オブジェクト型宣言はQML文書を、ディレクトリのインポートに含まれる 他のQML文書からのみ利用可能な型として登録することを可能にします。この内部型はディレクトリをインポートしたクライアントからは利用できません。

internal HighlightedButton HighlightedBtn.qml
JavaScriptリソース宣言<識別子> <ファイル名JavaScript リソース宣言は、与えられた識別子を通して JavaScript ファイルを公開します。

MathFunctions mathfuncs.js

ローカルファイルシステムのディレクトリにqmldir ファイルを置くことができる。これにより、そのディレクトリをインポートしたクライアントに対して、特定の QML タイプのみを公開することができます。さらに、ディレクトリ内の JavaScript リソースは、qmldir ファイルで宣言されない限り、クライアントに公開されません。

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