2017-08-07 3 views
0

Ich möchte eine Qml Map mit Kartenelementen (wie MapCircle, ...) aus einer QAbstractListModel auffüllen. Es scheint zwei dafür geeignete Qml-Tools zu geben, MapItemView [1] und Repeater [2]. Die Repeater ist leistungsfähiger (z. B. ermöglicht es verschachtelte Modelle) - gibt es also einen Grund, die MapItemView anstelle einer Repeater zu verwenden?Qt/Qml: Repeater vs. MapItemView für Kartenelemente

Grüße,

[1] http://doc.qt.io/qt-5/qml-qtlocation-mapitemview.html

[2] http://doc.qt.io/qt-5/qml-qtquick-repeater.html

MapItemView Quelle: http://code.qt.io/cgit/qt/qtlocation.git/tree/src/location/declarativemaps/qdeclarativegeomapitemview.cpp

Repeater Quelle: http://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickrepeater.cpp

+1

Es ist schwer zu beurteilen, aus der Dokumentation, aber in den meisten Fällen instanziiert "Views" nur so oft wie nötig. Was außerhalb des "Viewports" liegt, wird Ihren Speicher nicht überladen und die anfängliche Erstellungszeit wird besser sein. Der 'Repeater' ist Dump. Es wird 'Items' für jedes Element im Modell erstellt, egal ob diese angezeigt werden oder nicht. – derM

+0

Guter Punkt. Ich überprüfte den Quellcode: '' MapItemView'' fügt alle Elemente zur Map hinzu. Ich bin mir nicht sicher, was "Repeater" genau macht, aber wahrscheinlich wird es auch die Elemente nur zur Karte hinzufügen. Die Karte selbst behandelt das Rendern sichtbarer Objekte. – Hyndrix

Antwort

2

Sie MapItemView dafür verwenden soll. Die Verwendung von funktioniert nur beim Erstellen der Map. Wenn Sie anschließend Elemente in Ihrem Modell hinzufügen, wird kein Delegat zur Map hinzugefügt.

Die Tatsache, dass es zunächst mit Repeater funktioniert, aber nicht danach ist, weil:

  • den Repeater Eltern seine Delegierten seiner Eltern, die die Map
  • ist das Map Objekt dann seine untergeordneten Elemente einmal abtastet, wenn es erstellt (in einer C++ Funktion äquivalent zu Component.onCompleted)
  • darauf die Kinder scannen, die MapItem abgeleitete Objekte sind zu der Karte hinzugefügt werden, wie wenn Map.addMapItem() manuell aufrufen
  • Delegierte, die danach von der Repeater erstellt werden, sind nur an die Map weitergeleitet, aber nicht wirklich "hinzugefügt".

Seit MapItemView ist sich der Map es die Delegierten der Map hinzufügen können, wenn es ihnen schafft.

Eine der Einschränkungen von MapItemView ist, dass es nur mit QAbstractItemModel funktioniert und abgeleitet. Das bedeutet, dass es mit einem ListModel oder einem C++ - Modell arbeiten kann, aber nicht mit einem "dummen" Modell wie einem js-Array oder einer ganzen Zahl als Modell.

+0

Danke für die Klarstellung. – Hyndrix