QMLのComponent
とItem
の違いは何ですか?ドキュメントはここでは完全に明確ではありません。複数のウィジェットのコンテナとして使用するのに適したタイプは何ですか? Rectangle
で置き換えることはできますか?
たとえば、次の宣言の違いは何ですか。
Item {
id: itemWidget
Rectangle { id: one }
Rectangle { id: two }
}
そして
Component {
id: componentWidget
Rectangle { id: one }
Rectangle { id: two }
}
Component
を宣言するときに通常delegate
を使用するのはなぜですか?
これら2つのスニペットの違いは、Rectangle
がすぐに表示されることです。これは documentation に書かれています:
長方形自体は自動的にレンダリングおよび表示されますが、コンポーネント内で定義されているため、上記の長方形には当てはまらないことに注意してください。コンポーネントは、別のQMLファイルで定義されているかのようにQMLタイプをカプセル化し、要求されるまで(この場合、2つのLoaderオブジェクトによって)ロードされません。 ComponentはItemから派生していないので、何にもアンカーできません。
デリゲートを宣言するときは、作成する必要のあるデリゲートアイテムがいくつかあるため、Component
が使用されます。ここでは、単一のItem
は機能しません。 Component
は、オブジェクトを作成できるテンプレートと考えることができます。
Component
は、QMLの概念であると同時に物でもあります。 Item
はQtQuickモジュールで定義された視覚的なもので、QMLで使用できます。これら2つのことは概念的に異なります。
QMLの概念と同様に、再利用可能なものはすべてコンポーネントと呼ばれます。コンポーネントは複数の方法で定義できますが、簡単な方法の1つは、.qml
ファイルを作成し、コンポーネントに名前を付けるときに名前を付けることです。つまり、Button.qmlまたはSwitch.qmlです。 QMLエンジンがそのファイルをロードすると、ボタンまたはスイッチとして使用できます。
コンポーネントを定義する別の方法は、qmlファイルでComponent {}
を使用することです。これにより、新しいコンポーネントinlineを定義できます。定義されたコンポーネントinlineは、 loader によって明示的にロードされた後は機能しません。
一方、Item
はQtQuickモジュールで定義された単純な型です。
Item
がComponent
から技術的に継承されていなくても、Item
をComponent
と呼んでも問題ないと思います。もっと正確に言えば、.qml
のルートタイプがItem
の場合、カスタムコンポーネントはItem
に基づいていると言えます。