qt - 如何在地图上拖动多个目标?
问题描述
我想实现一个功能,用户可以在地图上拖动标记(定义为MapQuickItem)并自动更改其路径(定义为MapPolyline)。目前我只能拖动标记但不知道如何改变它的路径。
如果我想在Map下定义一个DropArea并调用MapPolyline.removeCoordinate()函数改变路径,如何访问委托中的索引?而且我不确定这个想法是否可行。
这是代码:
Map {
id: map
anchors.fill: parent
plugin: mapPlugin
zoomLevel: 14
activeMapType: supportedMapTypes[7]
/* maker */
MouseArea {
anchors.fill: parent
onClicked: {
var crd = map.toCoordinate(Qt.point(mouseX, mouseY))
console.log(crd)
markerModel.append({ "latitude": crd.latitude, "longitude": crd.longitude})
line.addCoordinate(crd)
}
}
MapItemGroup {
MapPolyline {
id: line
line.width: 3
line.color: "#515151"
}
MapItemView {
add: Transition {}
remove: Transition {}
model: ListModel {
id: markerModel
}
delegate:
MapQuickItem {
id: marker
coordinate: QtPositioning.coordinate(latitude, longitude)
anchorPoint: Qt.point(markerImage.width * 0.5, markerImage.height * 0.5)
sourceItem: Image {
id: markerImage
z: 5
width: 30
height: 30
source: index <= 0 ? "Images/starting point.svg" : "Images/point black.svg"
MouseArea {
anchors.fill: parent
onClicked: {
line.removeCoordinate(index);
markerModel.remove(index);
}
drag.target: marker
}
}
}
/* maker */
}
}
}
解决方案
我尝试了几种方法来解决这个问题。
- 此方法不可行,因为事件 ( drag.onActiveChanged ) 仅在拖动事件发生时触发。
drag.onActiveChanged: {
if(mouseArea.drag.active) {
line.replaceCoordinate(index, marker.coordinate);
}
}
我尝试在Map下定义一个DropArea并调用drag.ondragStarted()函数来触发事件,但是我没有弄清楚如何访问delegate中的索引,然后我放弃了。
有效!当我在地图上拖动标记时,路径自动改变了!每次标记坐标发生变化时都会触发事件(onPositionChanged )。
onPositionChanged: {
line.replaceCoordinate(index, marker.coordinate);
}
感谢自己:-)
推荐阅读
- parse-platform - Parse Server - 从包含的对象中选择一些字段
- java - 如何在 Java 中并行运行?
- vue.js - 使用 Vuex 从组件获取和编辑状态。ReferenceError: $store 未定义
- python - 如何用超过 1 个向量拟合 MultinomialNB?
- python - 如何处理 Panda Dataframe 中的字符串?
- azure - 代表 Azure AD 多租户应用程序的 Azure 资源管理器
- video - 使用 ffmpeg 保持电视格式的纵横比
- bash - For循环Shell脚本程序以特定模式查找最新文件
- css - Laravel MİX 编译警告
- java - JPA 多个名为 ... 的转换器在此持久性单元中定义