Loader QML Type
URLまたはコンポーネントからのサブツリーの動的ロードを許可します。詳細...
Import Statement: | import QtQuick |
Inherits: |
プロパティ
- active : bool
- asynchronous : bool
- item : QtObject
- progress : real
- source : url
- sourceComponent : Component
- status : enumeration
シグナル
- loaded()
メソッド
- object setSource(url source, object properties)
詳細説明
Loaderは、QMLコンポーネントを動的にロードするために使用されます。
Loaderは、QMLファイル(source プロパティを使用)またはComponent オブジェクト(sourceComponent プロパティを使用)をロードすることができます。例えば、コンポーネントをオンデマンドで作成する場合や、パフォーマンス上の理由からコンポーネントを不必要に作成しない場合などです。
ここでは、MouseArea がクリックされたときに、コンポーネントとして "Page1.qml" をロードする Loader を示します:
import QtQuick Item { width: 200; height: 200 Loader { id: pageLoader } MouseArea { anchors.fill: parent onClicked: pageLoader.source = "Page1.qml" } }
ロードされたオブジェクトは、item プロパティを使ってアクセスできます。
source またはsourceComponent が変更されると、以前にインスタンス化されたアイテムは破棄されます。source を空文字列に設定するか、sourceComponent をundefined
に設定すると、現在ロードされているオブジェクトが破棄され、リソースが解放され、Loader が空になります。
ローダーのサイズ設定動作
ビジュアル・タイプのロードに使用される場合、Loader は以下のサイジング・ルールを適用します:
- Loader に明示的なサイズが指定されていない場合、コンポーネントがロードされると、Loader は自動的にロードされたアイテムのサイズにリサイズされます。
- Loader に明示的なサイズが指定されていない場合、コンポーネントがロードされると、Loader は自動的にロードされたアイテムのサイズにリサイズされます。Loader のサイズが、width、height の設定またはアンカーリングによって明示的に指定されている場合、ロードされたアイテムは Loader のサイズにリサイズされます。
どちらのシナリオでも、アイテムとローダーのサイズは同じです。これにより、ローダーへのアンカーは、ロードされたアイテムへのアンカーと同等であることが保証されます。
sizeloader.qml | sizeitem.qml |
赤い矩形は、ルートアイテムのサイズに合わせます。 | 赤い長方形は、ルートアイテムの中央に配置され、50x50になります。 |
ソースコンポーネントがItemタイプでない場合、Loaderは特別なサイズルールを適用しません。
ロードされたオブジェクトからのシグナルの受信
ロードされたオブジェクトから発せられるシグナルは、Connections タイプを使用して受信できます。例えば、次のapplication.qml
は、MyItem.qml
をロードし、Connections オブジェクトを通して、ロードされたアイテムからmessage
シグナルを受け取ることができます:
application.qml | MyItem.qml |
import QtQuick Item { width: 100; height: 100 Loader { id: myLoader source: "MyItem.qml" } Connections { target: myLoader.item function onMessage(msg) { console.log(msg) } } } |
また、MyItem.qml
はローダーのスコープ内でロードされるため、ローダーまたはその親Item で定義された関数を直接呼び出すこともできます。
フォーカスとキーイベント
ローダーはフォーカススコープです。その子オブジェクトがアクティブなフォーカスを得るには、focus プロパティがtrue
に設定されている必要があります。(詳細は、「Qt Quick のキーボード・フォーカス」を参照してください)ロードされたアイテムで受信したキー・イベントも、ローダーに伝搬されないようにaccepted に設定する必要があります。
例えば、次のapplication.qml
は、MouseArea がクリックされると、KeyReader.qml
をロードします。動的にロードされたオブジェクトのItem と同様に、Loader のfocus プロパティがtrue
に設定されていることに注意してください:
application.qml | キーリーダー.qml |
KeyReader.qml
がロードされると、キー・イベントを受け入れ、event.accepted
をtrue
に設定します。これにより、イベントが親Rectangle に伝搬されなくなります。
QtQuick 2.0
以降、ローダーは非ビジュアル・コンポーネントをロードすることもできます。
ビューデリゲート内でのローダーの使用
デリゲートのロードパフォーマンスを向上させるために、ビューデリゲート内でローダーを使用したい場合があります。これはほとんどの場合うまくいきますが、コンポーネントのcreation context に関する注意すべき重要な問題があります。
次の例では、ListView によってdelegateComponent
のコンテキストに挿入されたindex
コンテキストプロパティは、Text からアクセスできなくなります。Loader は、myComponent
の作成コンテキストをインスタンス化時の親コンテキストとして使用し、index
は、そのコンテキストチェーン内の何も参照しないからです。
Item { width: 400 height: 400 Component { id: myComponent Text { text: index } //fails } ListView { anchors.fill: parent model: 5 delegate: Component { id: delegateComponent Loader { sourceComponent: myComponent } } } }
このような場合、コンポーネントをインラインに移動するか、別のファイルに移動することができます、
別のファイルに移動させる、
delegate: Component { Loader { source: "MyComponent.qml" //okay } }
または、ローダーのプロパティとして必要な情報を明示的に設定します(ローダーは自分自身をロードするコンポーネントのコンテキストオブジェクトとして設定するため、これは機能します)。
Item { width: 400 height: 400 Component { id: myComponent Text { text: modelIndex } //okay } ListView { anchors.fill: parent model: 5 delegate: Component { Loader { property int modelIndex: index sourceComponent: myComponent } } } }
Dynamic Object Creationも参照してください 。
プロパティ ドキュメント
active : bool |
このプロパティは、Loader が現在アクティブである場合にtrue
になります。このプロパティのデフォルト値はtrue
です。
Loader が非アクティブの場合、source またはsourceComponent を変更しても、Loader がアクティブになるまでアイテムはインスタンス化されません。
この値を非アクティブに設定すると、ローダーによってロードされたitem は解放されますが、source やsourceComponent には影響しません。
非アクティブなローダーのstatus は、常にNull
である。
source およびsourceComponentも参照のこと 。
asynchronous : bool |
このプロパティは、コンポーネントが非同期にインスタンス化されるかどうかを保持します。デフォルトはfalse
です。
source プロパティと併用すると、ロードとコンパイルもバックグラウンド・スレッドで実行されます。
非同期にロードすることで、コンポーネントによって宣言されたオブジェクトが複数のフレームにわたって作成され、アニメーションの不具合が発生する可能性が低くなります。非同期にロードする場合、ステータスはLoader.Loadingに変わります。コンポーネント全体が作成されると、item 、ステータスがLoader.Readyに変わります。
非同期ロードの進行中にこのプロパティの値をfalse
に変更すると、直ちに同期的に完了します。これにより、非同期ロードを開始し、非同期ロードが完了する前にローダーのコンテンツにアクセスする必要がある場合に、強制的に完了させることができます。
アイテムが徐々にロードされるのを見ないようにするには、visible
を適切に設定します。
Loader { source: "mycomponent.qml" asynchronous: true visible: status == Loader.Ready }
このプロパティは、オブジェクトのインスタンス生成にのみ影響することに注意してください。
item : QtObject |
このプロパティは、現在ロードされているトップレベルのオブジェクトを保持します。
QtQuick 2.0
以降、Loader は任意のオブジェクト・タイプをロードできます。
progress : real |
このプロパティは、ネットワークからのQMLデータのロードの進捗状況を0.0(何もロードされていない)から1.0(完了)まで保持します。ほとんどのQMLファイルは非常に小さいので、この値は0から1へと急速に変化します。
statusも参照してください 。
source : url |
このプロパティは、インスタンス化するQMLコンポーネントのURLを保持します。
QtQuick 2.0
以降、Loader はどのようなタイプのオブジェクトでもロードすることができます。
現在ロードされているオブジェクトをアンロードするには、このプロパティに空文字列を 設定するか、sourceComponent にundefined
を設定します。source
に新しい URL を設定すると、前の URL で作成されたアイテムもアンロードされます。
sourceComponent 、status 、progressも参照してください 。
sourceComponent : Component |
このプロパティは、インスタンス化するComponent を保持します。
Item { Component { id: redSquare Rectangle { color: "red"; width: 10; height: 10 } } Loader { sourceComponent: redSquare } Loader { sourceComponent: redSquare; x: 10 } }
現在ロードされているオブジェクトをアンロードするには、このプロパティをundefined
に設定します。
QtQuick 2.0
以降、Loader はあらゆるタイプのオブジェクトをロードできます。
status : enumeration |
このプロパティは、QML のロード状態を保持します。次のいずれかになります:
- Loader.Null - ローダーが非アクティブ、またはQMLソースが設定されていない。
- Loader.Ready - QMLソースがロードされました。
- Loader.Loading - QMLソースが現在ロードされています。
- Loader.Error - QML ソースの読み込み中にエラーが発生しました。
このステータスを使用して、最新情報を提供したり、何らかの方法でステータスの変化に対応したりします。例えば、以下のようなことが可能です:
- 状態変更をトリガーする:
State { name: 'loaded'; when: loader.status == Loader.Ready }
onStatusChanged
シグナルハンドラを実装する:Loader { id: loader onStatusChanged: if (loader.status == Loader.Ready) console.log('Loaded') }
- ステータス値にバインドする:
Text { text: loader.status == Loader.Ready ? 'Loaded' : 'Not loaded' }
ソースがローカル・ファイルの場合、ステータスは最初はReady(またはError)であることに注意。この場合、onStatusChanged シグナルは発生しませんが、onLoaded シグナルは起動されます。
progressも参照してください 。
シグナル・ドキュメント
loaded() |
このシグナルは、status がLoader.Ready
になったとき、または初期ロードに成功したときに発せられる。
注: 対応するハンドラはonLoaded
。
メソッド・ドキュメント
object setSource(url source, object properties) |
与えられたproperties を持つ、与えられたsource コンポーネントのオブジェクトインスタンスを作成します。properties 引数は省略可能です。このインスタンスは、ロードとインスタンス化が完了すると、item プロパティからアクセスできるようになります。
この関数が呼ばれた時点でactive プロパティがfalse
の場合、与えられたsource コンポーネントはロードされませんが、source と初期properties はキャッシュされます。ローダーがactive になると、source コンポーネントのインスタンスが、初期properties が設定された状態で作成されます。
この方法でコンポーネントのインスタンスの初期プロパティ値を設定しても、関連するBehaviorはトリガされない。
この関数を呼び出した後、ローダーactive を設定する前にsource またはsourceComponent を変更すると、キャッシュされたproperties はクリアされることに注意。
例:
// ExampleComponent.qml import QtQuick 2.0 Rectangle { id: rect color: "red" width: 10 height: 10 Behavior on color { NumberAnimation { target: rect property: "width" to: (rect.width + 20) duration: 0 } } } |
ここに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。