web-dev-qa-db-ja.com

QML:コンテナーとしてのコンポーネントvsアイテム

QMLのComponentItemの違いは何ですか?ドキュメントはここでは完全に明確ではありません。複数のウィジェットのコンテナとして使用するのに適したタイプは何ですか? Rectangleで置き換えることはできますか?

たとえば、次の宣言の違いは何ですか。

Item {
    id: itemWidget

    Rectangle { id: one }
    Rectangle { id: two }
}

そして

Component {
    id: componentWidget

    Rectangle { id: one }
    Rectangle { id: two }
}

Componentを宣言するときに通常delegateを使用するのはなぜですか?

24
Dmitry

これら2つのスニペットの違いは、Rectangleがすぐに表示されることです。これは documentation に書かれています:

長方形自体は自動的にレンダリングおよび表示されますが、コンポーネント内で定義されているため、上記の長方形には当てはまらないことに注意してください。コンポーネントは、別のQMLファイルで定義されているかのようにQMLタイプをカプセル化し、要求されるまで(この場合、2つのLoaderオブジェクトによって)ロードされません。 ComponentはItemから派生していないので、何にもアンカーできません。

デリゲートを宣言するときは、作成する必要のあるデリゲートアイテムがいくつかあるため、Componentが使用されます。ここでは、単一のItemは機能しません。 Componentは、オブジェクトを作成できるテンプレートと考えることができます。

19
Mitch

Componentは、QMLの概念であると同時に物でもあります。 ItemはQtQuickモジュールで定義された視覚的なもので、QMLで使用できます。これら2つのことは概念的に異なります。

QMLの概念と同様に、再利用可能なものはすべてコンポーネントと呼ばれます。コンポーネントは複数の方法で定義できますが、簡単な方法の1つは、.qmlファイルを作成し、コンポーネントに名前を付けるときに名前を付けることです。つまり、Button.qmlまたはSwitch.qmlです。 QMLエンジンがそのファイルをロードすると、ボタンまたはスイッチとして使用できます。

コンポーネントを定義する別の方法は、qmlファイルでComponent {}を使用することです。これにより、新しいコンポーネントinlineを定義できます。定義されたコンポーネントinlineは、 loader によって明示的にロードされた後は機能しません。

一方、ItemはQtQuickモジュールで定義された単純な型です。

ItemComponentから技術的に継承されていなくても、ItemComponentと呼んでも問題ないと思います。もっと正確に言えば、.qmlのルートタイプがItemの場合、カスタムコンポーネントはItemに基づいていると言えます。

5
Yasushi Shoji