Qt 在QML中,如何将MapItemGroup设置为MapItemView';代理组件是什么?
情况:我能够将QML映射项与模型/视图/委托一起使用。我能够处理单个项目 问题:下一步,我希望能够绘制多个项目。我需要在单个委托组件中放置多个QML MapItem(如MapCircle、MapRectangle等)。通常,QML支持委托中的多个项。MapItemView的委托存在问题:它不支持多个子项 我的方法:Qt 在QML中,如何将MapItemGroup设置为MapItemView';代理组件是什么?,qt,delegates,qml,model-view,Qt,Delegates,Qml,Model View,情况:我能够将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)
}
}
}
}
}
上述代码的输出为:
看到您的解决方案后,我也发现这一点很有趣:。您可以使用一个简单的
中继器,而不是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