2017-08-07 24 views
0

QAbstractListModelのマップ要素(MapCircleなど)をQmlマップに取り込みたいとします。これには、MapItemView [1]とRepeater [2]という2つのQmlツールが適しているようです。 Repeaterはより強力です(ネストされたモデルなど)。Repeaterの代わりにMapItemViewを使用する理由はありますか?Qt/Qml:マップ要素のリピータとMapItemView

よろしく、

[1] http://doc.qt.io/qt-5/qml-qtlocation-mapitemview.html

を[2] http://doc.qt.io/qt-5/qml-qtquick-repeater.html

MapItemViewソース:http://code.qt.io/cgit/qt/qtlocation.git/tree/src/location/declarativemaps/qdeclarativegeomapitemview.cpp

リピータソース:http://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickrepeater.cpp

+1

ドキュメンテーションから判断するのは難しいですが、ほとんどの場合、「ビュー」は必要なだけインスタンス化します。したがって、 'viewport'の外側にあるものは、あなたの記憶を乱すことはなく、最初の作成時間が改善されます。 'Repeater'はダンプです。表示されるかどうかにかかわらず、モデル内のすべての要素に対して 'Items'を作成します。 – derM

+0

良い点。私はソースコードをチェックしました: '' MapItemView''はすべての項目をマップに追加します。 '' Repeater''がどういうことをしているのか分からないけど、おそらく地図にアイテムを追加するだけだろう。マップ自体が可視アイテムレンダリングを処理します。 – Hyndrix

答えて

2

あなたはそのためのMapItemViewを使用する必要があります。 Repeaterを使用すると、Mapを作成したときにのみ機能します。後でモデルに要素を追加すると、代理人はマップに追加されません。

それはRepeaterで最初に動作しますが、ないその後ためであるという事実:Mapオブジェクトは、その後一度ときにその子項目をスキャン

  • Repeater両親彼の代理人Map
  • である彼の親へそれは(Component.onCompletedと同等のC++関数で)作成されました
  • Map.addMapItem()を手動で呼び出したときのように、MapItem由来の子オブジェクトがマップに追加されます
  • Repeaterでそれ以降に作成された代理人は、Mapの親になりますが、実際には追加されません。 MapItemView以来

はそれがそれらを作成するとき、それはMapにデリゲートを追加することができますMapを認識しています。

MapItemViewの制限の1つは、QAbstractItemModelでしか動作しないことです。つまり、ListModelまたはC++モデルでは動作しますが、js配列や整数などの「ダム」モデルでは動作しません。

+0

説明をありがとう。 – Hyndrix

関連する問題