2017-08-07 321 views
0

我想用QAbstractListModel來填充一個帶有地圖元素(如MapCircle,...)的Qml地圖。似乎有兩個適合於此的Qml工具,MapItemView [1]和Repeater [2]。 Repeater更強大(例如它允許嵌套模型) - 那麼是否有任何理由使用MapItemView而不是RepeaterQt/Qml:Repeater與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

很難從文檔中判斷,但在大多數情況下,'Views'只是根據需要實例化。因此,「視口」之外的內容不會混淆你的記憶,初始創建時間會更好。 'Repeater'是轉儲。它會爲模型中的每個元素創建'Items',無論它們是否被顯示。 – derM

+0

好點。我檢查了源代碼:''MapItemView''將所有項目添加到地圖。我不確定什麼''Repeater''準確地做,但可能它也會將這些項目添加到地圖。地圖本身處理可見項目渲染。 – Hyndrix

回答

2

應使用MapItemView爲該。 僅當您創建Map時才使用Repeater,如果您以後在模型中添加元素,則不會將代表添加到地圖。

,它工作在第一與Repeater但事實並非後來是因爲:

  • Repeater父母他委託他的父母這是Map
  • Map對象然後掃描其子項一次當它被創建(在相當於Component.onCompleted的C++函數中)
  • 在此掃描中,將來自MapItem的子對象添加到地圖中,就像手動調用Map.addMapItem()
  • 在此之後由Repeater創建的代表只是對Map的對象,但並未真正「添加」到它。

由於MapItemView是意識到Map它可以當它創建它們的代表加入到Map

MapItemView的限制之一是,它只適用於QAbstractItemModel和派生。這意味着它可以與ListModel或C++模型一起工作,但不能像js數組或整數模型那樣使用「啞」模型。

+0

感謝您的澄清。 – Hyndrix