Qt/Qml:地图元素的 Repeater 与 MapItemView

Hyn*_*rix 2 qt qml qtquick2 qtlocation

我想用QAbstractListModel. 似乎有两个 Qml 工具适合于此,MapItemView[1] 和Repeater[2]。更Repeater强大(例如,它允许嵌套模型) - 那么有什么理由使用 theMapItemView代替 a Repeater

问候,

[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

Gre*_*cKo 7

你应该用MapItemView它。Repeater仅当您创建 时才有效,Map如果您之后在模型中添加元素,则不会将任何委托添加到 Map 中。

它首先起作用但之后不起作用的事实Repeater是因为:

  • 父母Repeater他代表他的父母,这是Map
  • 然后,该Map对象在创建时会扫描其子项一次(在 C++ 函数中相当于Component.onCompleted
  • 在此扫描后,派生对象的子级MapItem将添加到映射中,就像手动调用时一样Map.addMapItem()
  • 之后创建的委托只是作为 的Repeater父级,Map但并未真正“添加”到其中。

由于MapItemView知道它可以在创建委托时Map添加委托。Map

的限制之一MapItemView是它只能与QAbstractItemModel和派生一起使用。这意味着它可以与 aListModel或 c++ 模型一起使用,但不能与 js 数组或整数这样的“哑”模型一起使用。