QT使用QML实现地图绘制虚线的示例代码

 更新时间:2023年07月04日 11:45:11   作者:喵喵叫的猴  
QML提供了MapPolyline用于在地图上绘制线段,这篇文章主要为大家详细介绍了QT如何使用QML实现在地图上绘制虚线,需要的小伙伴可以参考一下

QML提供了MapPolyline用于在地图上绘制线段,该线段是实线,因此我使用Canvas自定义绘制的方式在地图上绘制线段,如图:

鼠标在地图上点击后,在点击位置添加图标 ,当有多个图标被添加到地图上后,计算各个图标间的距离,并创建一个新的虚线线段组件,连接两个图标点,显示距离数值。如果对自定义图标添加拖动属性,效果如图:

MapDashLine.qml属性:

  • beginCoordinate:线段起始经纬度坐标
  • endCoordinate:线段终点经纬度坐标
  • lineDash:虚线样式
  • lineColor:虚线颜色
  • lineWidth:虚线粗细
  • textColor:显示距离文字颜色
  • textPixelSize:字体大小

MapDashLine.qml源码(我使用的是Qt5.15):

import QtQuick 2.15
import QtPositioning 5.15
 
Item {
    id:mapDashLine
    anchors.fill: parent
    property var beginCoordinate: QtPositioning.coordinate()
    property var endCoordinate: QtPositioning.coordinate()
    property var lineDash: [4,4]
    property color lineColor: "crimson"
    property int lineWidth: 2
    property color textColor: "crimson"
    property int textPixelSize: 14
    readonly property var mapItem: mapDashLine.parent
 
 
    Canvas{
        id:myCanvas
        anchors.fill: parent
        onPaint: {
            if(!mapDashLine.beginCoordinate.isValid || !mapDashLine.endCoordinate.isValid)
                return
            var ctx = getContext("2d")
            ctx.clearRect(0,0,myCanvas.width,myCanvas.height)
            ctx.strokeStyle = mapDashLine.lineColor
            ctx.lineWidth = mapDashLine.lineWidth
            ctx.setLineDash(mapDashLine.lineDash)
            //**绘制虚线
            ctx.beginPath()
            var beginPos = mapDashLine.mapItem.fromCoordinate(mapDashLine.beginCoordinate,false)
            ctx.moveTo(beginPos.x,beginPos.y)
            var endPos = mapDashLine.mapItem.fromCoordinate(mapDashLine.endCoordinate,false)
            ctx.lineTo(endPos.x,endPos.y)
            ctx.stroke()
            ctx.save()
            //**绘制文字
            var azimuth = endCoordinate.azimuthTo(beginCoordinate)
            if(azimuth>=180)
                azimuth = azimuth - 180
            var distance = endCoordinate.distanceTo(beginCoordinate)
            var text = (distance/1000).toFixed(0)+"Km"
            ctx.fillStyle = mapDashLine.textColor
            ctx.font = mapDashLine.textPixelSize+"px Arial"
            ctx.textAlign = "center"
            var centerX =  (beginPos.x+endPos.x)/2
            var centerY = (beginPos.y+endPos.y)/2
            ctx.translate(centerX,centerY)
            ctx.rotate(azimuth*Math.PI/180-Math.PI/2)
            ctx.fillText(text,0,-mapDashLine.textPixelSize/2)
            ctx.restore()
        }
    }
 
    onBeginCoordinateChanged: {
        update()
    }
    onEndCoordinateChanged: {
        update()
    }
    onLineDashChanged: {
        update()
    }
    onLineColorChanged: {
        update()
    }
    onLineWidthChanged: {
        update()
    }
    onTextColorChanged: {
        update()
    }
    onTextPixelSizeChanged: {
        update()
    }
 
    Connections{
        target: mapDashLine.mapItem
        function onZoomLevelChanged(){
            update()
        }
        function onVisibleRegionChanged(){
            update()
        }
    }
 
    function update(){
        myCanvas.requestPaint()
    }
}

到此这篇关于QT使用QML实现地图绘制虚线的示例代码的文章就介绍到这了,更多相关Qt QML地图绘制虚线内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • do...while(0)的妙用详细解析

    do...while(0)的妙用详细解析

    do...while(0)消除goto语句;通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果遇到错误则退出函数,当然,退出前先释放资源
    2013-09-09
  • C语言多种获取字符串长度的方法

    C语言多种获取字符串长度的方法

    这篇文章主要介绍了C语言多种获取字符串长度的方法,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 最大子矩阵问题实例解析

    最大子矩阵问题实例解析

    这篇文章主要介绍了最大子矩阵问题实例解析,分别列举了Java和C语言的相关实现,需要的朋友可以参考下
    2015-08-08
  • C++中Boost的智能指针weak_ptr

    C++中Boost的智能指针weak_ptr

    这篇文章介绍了C++中Boost的智能指针weak_ptr,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 用C语言简单实现扫雷小游戏

    用C语言简单实现扫雷小游戏

    这篇文章主要为大家详细介绍了用C语言简单实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言二叉树的遍历示例介绍

    C语言二叉树的遍历示例介绍

    大家好,本篇文章主要讲的是C语言二叉树的遍历示例介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C语言基础之C语言格式化输出函数printf详解

    C语言基础之C语言格式化输出函数printf详解

    这篇文章主要介绍了C语言格式化输出函数printf详解,printf函数中用到的格式字符与printf函数中用到的格式修饰符,感兴趣的小伙伴可以借鉴一下
    2023-03-03
  • 浅谈2路插入排序算法及其简单实现

    浅谈2路插入排序算法及其简单实现

    这篇文章主要介绍了浅谈2路插入排序算法及其简单实现,虽算不上是常用的排序方法,但在数据库等方面依然有用上的机会,需要的朋友可以参考下
    2015-08-08
  • 教你使用Matlab制作图形验证码生成器(app designer)

    教你使用Matlab制作图形验证码生成器(app designer)

    这篇文章主要和大家分享如何利用Matlab制作一款图形验证码生成器,文中的实现步骤讲解详细,感兴趣的小伙伴可以跟随小编动手试一试
    2022-02-02
  • 详解C语言中条件判断语句if和switch的用法

    详解C语言中条件判断语句if和switch的用法

    这篇文章主要介绍了详解C语言中条件判断语句if和switch的用法,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2016-04-04

最新评论