Qt 在QML中,如何将MapItemGroup设置为MapItemView';代理组件是什么?

Qt 在QML中,如何将MapItemGroup设置为MapItemView';代理组件是什么?,qt,delegates,qml,model-view,Qt,Delegates,Qml,Model View,情况:我能够将QML映射项与模型/视图/委托一起使用。我能够处理单个项目 问题:下一步,我希望能够绘制多个项目。我需要在单个委托组件中放置多个QML MapItem(如MapCircle、MapRectangle等)。通常,QML支持委托中的多个项。MapItemView的委托存在问题:它不支持多个子项 我的方法: 我认为使用MapItemGroup会有效。但我好像错过了什么。关于如何使其作为代理组件工作,文档也没有那么广泛。附加的代码段显示了此实现 在下面的代码中: 委派循环,委派正确的工

情况:我能够将QML映射项与模型/视图/委托一起使用。我能够处理单个项目

问题:下一步,我希望能够绘制多个项目。我需要在单个委托组件中放置多个QML MapItem(如MapCircle、MapRectangle等)。通常,QML支持委托中的多个项。MapItemView的委托存在问题:它不支持多个子项

我的方法:

  • 我认为使用MapItemGroup会有效。但我好像错过了什么。关于如何使其作为代理组件工作,文档也没有那么广泛。附加的代码段显示了此实现

  • 在下面的代码中:

    • 委派循环,委派正确的工作
    • 不显示delegateGroup
    一个简单的实现:

    import QtQuick 2.10
    import QtPositioning 5.6
    import QtLocation 5.9
    import QtQuick.Controls 2.3 as QQc2
    
    QQc2.ApplicationWindow {
        visible: true
        width: 640
        height: 480
        // Some list model
        ListModel {
            id: someModel
            ListElement {lat: 0; lon: 0}
            ListElement {lat: 5; lon: 0}
            ListElement {lat: 5; lon: 5}
            ListElement {lat: 0; lon: 5}
        }
    
        Map {
            id: map
            anchors.fill: parent
            plugin: Plugin {name: "osm"}
            center: QtPositioning.coordinate(2.5, 2.5)
            zoomLevel: 6
    
            // Some views to test the model
            // delegateCircle, delegateRect work fine
            // delegateGroup is not displayed 
            MapItemView {
                model: someModel
                delegate: MapCircle {
                    id: delegateCircle
                    border.color: "red"
                    border.width: 1
                    center: QtPositioning.coordinate(model.lat, model.lon)
                    radius: 50*1000
                }
            }
    
            MapItemView {
                model: someModel
                delegate: MapRectangle {
                    id: delegateRect
                    border.color: "green"
                    border.width: 3
                    topLeft     : QtPositioning.coordinate(model.lat+1, model.lon-1)
                    bottomRight : QtPositioning.coordinate(model.lat-1, model.lon+1)
                }
            }
    
            MapItemView {
                model: someModel
                delegate: MapItemGroup {
                    id: delegateGroup
                    MapCircle {
                        id: innerCircle
                        border.color: "green"
                        border.width: 3
                        center: QtPositioning.coordinate(model.lat, model.lon)
                        radius: 75*1000
                    }
    
                    MapRectangle {
                        id: innerRect
                        border.color: "red"
                        border.width: 6
                        topLeft     : QtPositioning.coordinate(model.lat+2, model.lon-2)
                        bottomRight : QtPositioning.coordinate(model.lat-2, model.lon+2)
                    }
                }
            }
        }
    }
    
    上述代码的输出为:

  • 我还尝试将MapItemGroup用作MapQuickItem类型的sourceItem。这也不管用
  • 我想要实现的目标:

    嗯。我需要使用MapItemView绘制多个地图项。欢迎任何其他解决方案/方法(包括C++后端程序)。 编辑

    谢谢你@GrecKo和@Yoann。两种解决方案都有效。然而,我选择继续使用实例化器,因为它更适合我的应用程序


    看到您的解决方案后,我也发现这一点很有趣:。

    您可以使用一个简单的
    中继器,而不是
    MapItemView

    import QtQuick 2.10
    import QtPositioning 5.6
    import QtLocation 5.9
    import QtQuick.Controls 2.3
    
    ApplicationWindow {
        visible: true
        width: 640
        height: 480
        // Some list model
        ListModel {
            id: someModel
            ListElement {lat: 0; lon: 0}
            ListElement {lat: 5; lon: 0}
            ListElement {lat: 5; lon: 5}
            ListElement {lat: 0; lon: 5}
        }
    
        Map {
            id: map
            anchors.fill: parent
            plugin: Plugin {name: "osm"}
            center: QtPositioning.coordinate(2.5, 2.5)
            zoomLevel: 6
    
            Repeater
            {
                model: someModel
                MapItemGroup {
                    id: delegateGroup
                    MapCircle {
                        id: innerCircle
                        border.color: "green"
                        border.width: 3
                        center: QtPositioning.coordinate(model.lat, model.lon)
                        radius: 75*1000
                    }
    
                    MapRectangle {
                        id: innerRect
                        border.color: "red"
                        border.width: 6
                        topLeft     : QtPositioning.coordinate(model.lat+2, model.lon-2)
                        bottomRight : QtPositioning.coordinate(model.lat-2, model.lon+2)
                    }
    
                    Component.onCompleted: map.addMapItemGroup(this)
                }
            }
        }
    }
    

    正如GrecKo所指出的,为了使其与动态模型一起工作,必须“手动”将项组添加到映射中,因此行
    Component.onCompleted:map.addMapItemGroup(this)

    不幸的是,
    MapItemView
    只能与
    MapItem
    -派生项一起工作,而且
    MapItemGroup
    不是其中之一

    您可以使用
    中继器
    ,它将适用于从一开始就创建的代理,但如果稍后在模型中添加行,它将不起作用。 我在《为什么
    中继器
    不适合
    地图
    中解释了这一点

    在我的回答中,我建议使用
    MapItemView
    ,但在这里不适用。 希望还有最后一个可用的解决方案:

    也就是说,您可以像现在一样使用代码

    import QtLocation 5.12
    import QtPositioning 5.12
    

    谢谢@Yoann。你的解决方案有效。然而,我觉得实例化器是我应该用于我的情况的方式。非常感谢!还创建了错误报告:。这正是我要找的。非常感谢你!干杯,谢谢!还创建了错误报告:。
    import QtLocation 5.12
    import QtPositioning 5.12