2017-08-07 322 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