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

Qt/Qml: Repeater vs. MapItemView for map elements

我想用 QAbstractListModel 中的地图元素(如 MapCircle 等)填充 Qml 地图。似乎有两个 Qml 工具适用于此,MapItemView [1] 和 Repeater [2]。 Repeater 更强大(例如,它允许嵌套模型)——那么有什么理由使用 MapItemView 而不是 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

您应该为此使用 MapItemView。 使用 Repeater 仅在您创建 Map 时有效,如果您之后在模型中添加元素,则不会向地图添加委托。

它最初与 Repeater 一起工作但后来不工作的事实是因为:

  • Repeater parent 是他的 parent 代表,即 Map
  • Map object 然后在创建时扫描其 child 项目一次(在等同于 Component.onCompleted 的 c++ 函数中)
  • 在此扫描后,MapItem派生的 object 的 children 被添加到地图中,就像手动调用 Map.addMapItem()
  • 时一样
  • 在那之后由 Repeater 创建的委托只是 parented 到 Map 而不是真正地 "added" 到它。

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

MapItemView 的局限之一是它仅适用于 QAbstractItemModel 和派生。这意味着它可以使用 ListModel 或 c++ 模型,但不能使用 "dumb" 模型,如 js 数组或整数模型。