我的目标是允许用户编辑 MapPolyLine 使用鼠标拖放在线上的点。我通过创建一个 C++ 模型来实现这一点,该模型公开了一个path()方法,用于转储所有点以绘制线。
然后我使用这个模型为线上的每个顶点显示一组 MapCircles。这些 Mapcircles 具有在拖动完成后更新 MapPolyLine 模型的拖动事件。
这适用于 < 500 个顶点的线。然后性能受到非常严重的影响。我的一些行(来自 GPX 文件)有 10,000 个顶点。
所以我试图只在靠近鼠标悬停点的线上暴露 MapCircles。但是(除非我弄错了) MapPolyLine 的 MouseArea 似乎是线的边界框,并且可以在奇怪的情况下触发悬停。
我发现onEntered事件运行良好,足以让我计算出线上的位置,然后显示一组靠近该位置的 MapCircles。这是一个次优的解决方案,因为用户必须主动单击该线才能显示这些 MapCircles。
我的问题是:“我是否使用正确的策略来允许编辑 MapPolyLine? ”。在当前的 QtLocation 实现中,我看不到任何其他方法。
代码现在相当复杂。它的结构是:-
GPXModel {
id: gpxModel
}
MapPolyLine {
path: gpxModel.path
MouseArea {
onEntered: {
var mapCoord = gpxLine.mapToItem(mapView,mouseX,mouseY);
var coord = mapView.toCoordinate(Qt.point(mapCoord.x,mapCoord.y));
//tell the model where we are in the array of points so we can display MapCircles around this point
gpxModel.setEditLocationFromCoordinate(coord);
}
}
}
MapItemView {
model: gpxModel
MapCircle {
//this is a custom role I use to return a sub-set of points set by setEditLocationFromCoordinate
center: positionRole
MouseArea{
anchors.fill: parent
drag.target: parent
onDragActiveChanged: {
if(!drag.active){
gpxModel.updatePositionOfMarker();
}
}
}
}
}
该项目在https://github.com/citizenfish/servalan_2020上开源,但需要注意的是,我将其用作学习练习,所以它有点被破解了。
编辑:我不想使用基于 webview 的解决方案。该项目的重点是在本机 Qt 中执行此操作,而对第三方 javascript 库/浏览器的依赖最小。