Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode . Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).

I want to write an application which shows different graphical objects on an map. I want to use MapItemView. The data for my application is in a model. It can contain circle , polygones or other graphical objects. I don't know how I can write a delegate for different graphical objects. It work's fine for example for circles. In this case I use the MapCircleClass.

Hi @Thomas-W ,
Personally I haven't tried QtLocations myself but looking at the documentation it seems that it somewhat similar to ListView in terms of functionality for eg. it uses model , delegete etc..
In case of ListVIew we could assign multiple delegates by for eg. assigning it a Component containing a Loader which loads different Items. Something like this:
http://doc.qt.io/qt-5/qml-qtquick-loader.html#using-a-loader-within-a-view-delegate

Inside the Loader you can include a condition so that one particular Item will be loaded as required.

Hi p3Co, I have tried your hint. Below is the source code of a simple example, but it doesn't work. Any ideas?

MyModel.qml

import QtQuick 2.0
ListModel {
     id: elementModel
     ListElement {
         type: "circle"
         refLong: 51.23
         refLat:  7.9
     ListElement {
         type: "polygon"
         refLong: 52.23
         refLat:   8.0

MultiDelagte.qml

import QtQuick 2.0
import QtPositioning 5.6
import QtLocation 5.6
Loader {
    id: multiDelegate
    anchors.fill: parent
    anchors.topMargin: 2
    sourceComponent: bestDelegate(type)
    function bestDelegate(t) {
        if (t === "circle")
            return circleDelegate
        return polygonDelegate // t == "string"
    Component {
        id: circleDelegate
        MapCircle {
            radius: 5000
            color: "red"
            center {
                latitude: refLat
                longitude: refLong
    Component {
        id: polygonDelegate
        MapPolygon {
            color: "green"
            path: [{
                    latitude: refLat,
                    longitude: refLong
                    latitude: refLat,
                    longitude: refLong
                    latitude: refLat,
                    longitude: refLong

main.qml:

import QtQuick 2.5
import QtQuick.Controls 2.1
import QtQuick.Controls.Material 2.1
import QtPositioning 5.6
import QtLocation 5.6
ApplicationWindow {
    id: appWindow
    visible: true
    width: 640
    height: 480
    title: qsTr("Air Companion")
    property variant centerCoordinate: QtPositioning.coordinate(51.3666667, 7.7)
        //! [centercoordinate]
        Plugin {
            id: myPlugin
            name: "osm"
        id:myMap
        plugin: myPlugin
        center: centerCoordinate
        zoomLevel: 15
        anchors.fill:parent
        MapItemView {
              id: dataView
              model: MyModel{}
              delegate: MultiDelegate{}
			

@p3c0 I'm getting no errors. I have tried to use Component as the root element. But it doesn't work, no circle or polygon was shown on the map. I have tried nearly the same example with a ListView. In this case it worked well.

Has anyone a working sample?

"La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
~Napoleon Bonaparte

On a crusade to banish setIndexWidget() from the holy land of Qt

@VRonin said in Delegate for different graphical objects in MapItemView:

if (t === "circle")

one = too much?

This is Ok in Javascript.