4

我的目标是允许用户编辑 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 库/浏览器的依赖最小。

4

0 回答 0