首页 > 其他分享 >QT使用QML实现地图绘制虚线

QT使用QML实现地图绘制虚线

时间:2023-11-03 14:32:31浏览次数:35  
标签:QT beginCoordinate mapDashLine ctx update 虚线 QML var property

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

QT使用QML实现地图绘制虚线_2d

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

QT使用QML实现地图绘制虚线_2d_02

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,beginCoordinate,mapDashLine,ctx,update,虚线,QML,var,property
From: https://blog.51cto.com/u_15641375/8169821

相关文章

  • Qt开发实现字幕滚动效果
    1、效果展示我们经常能够在外面看到那种滚动字幕,那么就拿qt来做一个吧。2、实现思路实现一个窗口部件,这个窗口部件显示了一串文本标语,它会每t毫秒向左移动一个像素。如果窗口部件比文本宽,那么文本将会被多次重复,直到能够填满整个窗口部件的宽度为止。3、滚动窗口部件创建一个滚......
  • Qt3D改变观察视角例程(二)
    本例依旧是改变3D视角。不同的是这个是视野位置不变而只改变观察方向。相当于一个人站在原地不动,旋转脑袋看周围的东西。测试的条件是VS2017和Qt5.9。主要的知识点就是欧拉角的计算。下面是效果图:头文件:classQOpenGLTexture;classQOpenGLBuffer;classMvOpenGLWidget:p......
  • PyQt5-如何设置主窗口居中?退出应用程序如何操作?
    (15如何设置主窗口居中?退出应用程序如何操作?)1如何实现主窗口居中显示?让主窗口居中,其实就是让窗口的左右边缘到左右屏幕距离相等,让窗口的上下边缘到上下屏幕的距离相等;主要是需要进行计算和移动工作;可以使用QDesktopWidget类来获取屏幕的大小和位置信息,然后根据这些信息计......
  • Qt - 获得当前窗口所在屏幕的大小
    qt获得当前窗口所在屏幕的大小 假如这个窗口的指针为this,记得要加头文件哦#include<QDesktopWidget>#include<QApplication>//获得当前屏幕是第几屏幕intnumber=QApplication::desktop()->screenNumber(this);//如果number是-1会出现崩溃,就是用默认0if(number<0)......
  • qt按键图标大小和设置大小不符的问题记录
    问题描述:在导航栏中有几个toolbuttoon,ui文件设置的控件大小相同但图标大小不同问题解决:经过排查,图片和ui文件没有问题,最后发现qss样式中border-image,background-image和image对于相同图标会显示出不同大小。#background-image只根据图片资源的大小,不按照控件的大小,相对于控......
  • Qt 中的正则表达式
    Qt中的正则表达式常用QRegExp类一、正则表达式的常用匹配符^test:匹配字符的开始[^test]:表示除t,e,s,t以外的字符$:表示匹配字符串的结束[0-9]:表示0到9之间的数字*:表示匹配前面的字符0次或多次,如a*表示匹配0次或多次a字符,[0-9]*表示匹配数字0次或多次+:匹配前面的......
  • Qt获取电脑有几个网卡,并获取对应的IPV4
    标题:Qt获取电脑网卡对应的ip|Qt计算电脑有几个网卡|Qt获取网卡ip信息|Qt判断获取到的ip是否是IPV4 demo流程:1.点击搜索网卡按钮,搜索电脑所有的网卡,将网卡名称添加到QComBoBox下拉框中2.切换下拉框,点击获取IP按钮,查询出选择的网卡的对应ip(IPV4)  //x.h#include......
  • Qt通过UDP发送广播
      //x.hQUdpSocket*udp=nullptr;//UDP对象voidcreateUdpAndSendData();//创建UDP对象和发送广播数据voiddropUdp();//释放UDP对象voidreadData();//用来接收其他设备发送的数据voidcreateUdpAndSendData(){......
  • VS Qt扩展插件下载地址
      使用vs开发qt项目,需要安装qt插件QT插件下载地址:https://mirrors.ustc.edu.cn/qtproject/official_releases/vsaddin/ ......
  • Centos安装MQTT与基本配置
    1.Centos默认没有mosquitto,需要额外安装一个软件包,EPEL软件库。该库中有很多Linux发行版软件  sudoyum-yinstall epel-release2.安装mostuitto   sudoyum-yinstallmosquitto3.执行完以上两步,mosquitto就已经安装成功4.测试是否安装成功  sudosystemctl......