Qt/Qml: Repeater против MapItemView для элементов карты

Я хочу заполнить карту Qml элементами карты (например, MapCircle,...) из QAbstractListModel, Кажется, для этого есть два инструмента 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

1 ответ

Решение

Вы должны использовать MapItemView для этого. С помощью Repeater работает только при создании Map, если вы добавите элементы в вашу модель впоследствии, ни один делегат не будет добавлен на карту.

Тот факт, что это работает сначала с Repeater но не потом, потому что:

  • Repeater родители его делегат его родителю, который является Map
  • Map Затем объект сканирует свои дочерние элементы один раз при создании (в функции C++, эквивалентной Component.onCompleted)
  • После этого сканирования дети, которые MapItem объекты добавляются на карту, как при ручном вызове Map.addMapItem()
  • Делегаты, созданные после этого Repeater только что родились Map но на самом деле не "добавил" к нему.

поскольку MapItemView знает о Map он может добавить делегатов к Map когда он их создает.

Одно из ограничений MapItemView является то, что это работает только с QAbstractItemModel и выведено. Это означает, что он может работать с ListModel или модель C++, но не с "тупой" моделью, такой как массив js или целое число в качестве модели.

Другие вопросы по тегам