QML地图绘制虚线

2023-05-16

        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()
    }
}

 完整Demo下载地址:

https://download.csdn.net/download/zjgo007/87705420https://download.csdn.net/download/zjgo007/87705420

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QML地图绘制虚线 的相关文章

  • java面试清单和书籍推荐 五颗星五颗星

    前言 面试必备技能清单 xff0c 这里不会详细论述 xff0c 更多的是清单列举 xff0c 罗列一些关键字和链接注释 数据结构与算法 排序算法 选择排序冒泡排序插入排序快速排序快速排序 xff08 普通 xff0c 二路 xff0c 三
  • ssh Key exchange was not finished sshd

    报错 xff1a ssh Key exchange was not finished 则需修改sshd文件 链接 xff1a Key exchange was not finished connection is closed近期遇到这个错
  • C++类成员冒号初始化以及构造函数内赋值

    通常我们对类成员进行 初始化 有两种方式 xff1a 1 构造函数后面跟冒号 xff1b 2 构造函数里面对成员进行赋值 有些人不太注意这个小细节 xff0c 或者根本不知道他们的区别 xff0c 认为两种方式是一样的 这个误解有时可能会对
  • Web项目中pom.xml中<Project>爆红

    artifactId 39 with value 39 项目名 39 does not match a valid id pattern 主要是项目名中 lt artifactId gt 项目名 lt artifactId gt 项目名带空
  • 《自动化学报》踩坑心得

    LATEX使用于文本编辑器此次我是用的是latex安装方法是TeXLive 43 WinEdt 模板使用的是自动化学报模板 xff0c 使用的是中文模板 xff0c for paper in Chinese 文件 xff0c 打开之后选择打
  • 个人介绍以及课程期待

    本人朱杰 xff0c 现为北京理工大学大二学生 xff0c 主攻软件工程 xff0c 性格开朗 现在正在学习软件工程基础 xff0c 特写此文 xff0c 以明志 我希望能通过这门课能够更系统的了解软件工程 xff0c 之前对此的认知都是很
  • 向日葵提示‘’连接断开‘’解决方法(已解决非常好用)终端执行 xhost + 即可

    1 这个是授权访问 xff0c 一般输入xhost 43 即可 向日葵远程桌面提示连接断开解决方法 终端执行 xhost 43 即可 xhost 43 是使所有用户都能访问Xserver xhost 43 ip使ip上的用户能够访问Xser
  • 对vector使用指针

    include lt stdio h gt include lt iostream gt include lt vector gt using namespace std int main vector lt int gt a b c fo
  • 岁月划过生命线(我的2013-大二.上)

    岁月划过生命线 大二 上 又一次大清早被红马甲查赶出被窝 xff0c 让哥光着屁股就跑到隔壁宿舍去了 xff0c 真心恨死他们 这是一篇最早写于 2013 11 26 日的日志 xff0c 通过后来不断地增删改 xff0c 来总结 xff0
  • 带中文字库的12864LCD显示程序

    带中文字库的12864LCD显示程序 include lt reg52 H gt include lt intrins H gt define uchar unsigned char define uint unsigned int sbi
  • QML 自定义Legend(点击Legend隐藏/显示)

    QML ChartView中提供了默认的Legend xff0c 可对图例进行一些简单的例如颜色 字体等的设置 xff0c 但是当需要图例具有个性化的功能时 xff08 如单击时隐藏或显示 xff09 时 xff0c 就需要使用自定义的Le
  • Qt多线程中使用QTimer(常见问题汇总)

    我们经常需要将一些耗时的工作在子线程中进行 xff0c 同时在子线程中又需要用到循环事件时 xff0c 一种方法使用While sleep 进行线程控制 另一种创建一个QTimer对象 xff0c 使用信号与槽机制将信号timeout 与相
  • Qt 中使用 VLC-Qt 播放网络视频流(附实例)

    VLC Qt库 xff1a 一个在libVLC基础上结合了Qt框架的开源库 它提供了媒体播放的视频 音频处理控制的核心类 xff0c 并提供基于QWidget和QML的GUI框架 效果图 xff1a 官网地址 xff1a Quickly c
  • 微信小程序云开发处理微信支付成功的回调函数(云函数实现)

    在使用微信小程序开发微信支付功能时 xff0c 使用云开发中的微信支付云调用 xff0c 将商品信息 支付价格等信息传入云函数中 xff0c 并在返回的字段payment获取wx requestPayment接口所需要的所有信息 通过此方法
  • 前端 大数据 echarts

    https echarts apache org handbook zh basics download
  • Qt使用钩子后台监控键盘并在界面中响应

    当我们的Qt程序需要在后台监听键盘的操作或者屏蔽键盘的操作时 xff0c 就需要用到系统的API xff0c 因此用到Windows钩子 xff0c 下面简单介绍下使用钩子监控键盘按键 xff0c 原理较简单 xff0c 代码上我都注释了
  • Qt 5.15.2添加msvc2019编译环境(不需要安装VS)

    安装Qt5 15 2 只能在线安装 xff0c 安装时候注意勾选MSVC 2019 64 bit支持 xff0c 其他的根据自己需要勾选 xff0c 点击下一步等待Qt安装完毕 xff0c 此时QtCreator中Kits里Desktop
  • QML Map中使用Open Street Map(osm)离线地图(瓦片地图加载方式)

    当使用QML Map显示地图时 xff0c 有时候无法连接互联网 xff0c 因此需要使用离线模式加载地图 xff0c 加载离线地图瓦片时 xff0c 需要为插件设置参数信息 xff0c 其中name表示参数字段 xff0c value表示
  • Qt Creator 无法编辑Qml界面,报错:“Qt Quick emulation layer crashed”

    今日在Qml界面编辑中 xff0c 突然无法使用设计师编辑器 xff0c 并报错如图 xff1a 代码定位也无法定位到错误的位置处 xff0c 通过注释代码的方式检查后 xff0c 发现错误产生原因是某个部件设置了两个状态State xff
  • QML中使用QPen设置组件边框(以CandlestickSeries为例)

    QML中提供了很多组件是由C 43 43 中绘制而注册到QML中使用的 xff0c 这些组件采用QPen绘制组件边框 xff0c 这样的组件均可使用返回QPen的方法设置边框样式 例如CandlestickSeries就提供了数据展示的蜡烛

随机推荐

  • Qt QML 自绘GPS方位校北仪控件

    校北仪用于显示不同设备与参照方位之间的误差夹角 xff0c 如果仅仅使用柱状图显示多个不同设备误差的数值 xff0c 数据不够直观表示 xff0c 因此自己画一个 xff0c 效果如图 xff1a 该控件使用QQuickPaintedIte
  • QML 地图修改插件源码(三),Map在Plugin中设置加载地图类型

    常用的地图种类分为交通图 xff0c 地形图 xff0c 卫星图等等 xff0c 在QML的Map xff08 以OSM地图为例 xff09 中提供activeMapType属性用于读取当前显示的地图类型 xff08 注意 xff1a 该属
  • QML 地图修改插件源码(四),Map根据目录作为索引加载地图瓦片

    QML中的地图 以OSM为例 在使用过程中会发现当地图层数很多时 xff0c 特别是如果使用离线地图且地图层级较多时地图会变得很卡 xff08 在线地图加载的层级数多且不清除缓存时也会卡 xff09 xff0c 原因在于QML地图插件对地图
  • Qt Quick 3D中将3D场景(如.obj)转换为.mesh

    Qt 5 15以后提供了Qt Quick 3D的新模块 xff0c 该模块可使用可视化的方式即可进行3D模型的显示 xff0c 并且相较于Qt 3D来说 xff0c 该模块的API更为高级 xff0c 使用者不需要自己设计底层的细节 该模块
  • Qt Quick 3D系列(一):加载3d模型

    如果我们想在QML中使用3D且你之前没有三维程序开发的基础 xff0c 使用Qt Quick 3D是个不错的选择 xff0c 下面我介绍如何使用Qt Quick 3D加载3d模型 注意 xff1a Qt Quick 3D从Qt 5 15之后
  • boa常见错误整理

    错误1 xff1a bison y d boa grammar y gcc g O2 pipe Wall I c o y tab o y tab c y tab c In function yyparse y tab c 1295 warn
  • Qt Quick 3D系列(二):鼠标控制3D模型旋转缩放

    上一篇文章Qt Quick 3D系列 xff08 一 xff09 xff1a 加载3d模型我们讲述了如何在Qt Quick 3D中显示一个3D模型 xff0c 那么显示了3D模型后如何使用鼠标进行旋转呢 xff1f 在Qt 3D中提供了Or
  • Qt Quick 3D系列(三):设置三维模型的金属光泽材质

    前面的博客中介绍了如何在Qt Quick 3D中加载三维模型 xff0c 下面介绍如何设置三维模型的材质 xff0c 例如下图模型 我需要设置为金属材质时 xff0c 设置该Model的materials为PrincipledMateria
  • Qt Quick 3D系列(四):为三维模型添加动画效果

    Qt Quick 3D旨在让那些熟悉QML开发的人能够使用非常少的学习成本实现3D开发 xff0c 因此对于三维模型动画没有类似与Qt 3D中有个专门的Qt3DAnimation来控制动画效果 xff0c 而是直接使用QML中的Animat
  • Qt Quick 3D系列(五):三维模型展示示例

    为了展示一个好看的3D模型 xff0c 需要对模型设置背景 xff0c 设置三维材质 xff0c 设置周围光线 xff0c 设置模型阴影等等 下面示例展示了一个比较好看的三维模型效果 xff0c 大家可以先在C4D等调整好模型效果 xff0
  • QML 地图可拖拽位置标签组件

    在地图上显示位置信息时 xff0c 有时候需要同时显示该位置的详细信息 该组件可在地图上显示一个连接到地图地理位置的标签框 xff0c 该标签框可点击进行拖拽 在地理位置改变 地图缩放 地图平移时 xff0c 该标签框的相对位置保持不变 x
  • 使用QQuaternion对Qt Data Visualization中模型进行旋转

    在Data Visualization中 xff0c 三维显示的OBJ需要旋转时使用rotation属性 xff0c 但是该属性传入的值是一个四元数QQuaternion xff0c 直接赋值四元数很复杂 xff0c 因此使用转化的方式获得
  • QML 可拖拽边框和顶点调整大小组件(新增对主窗口支持)

    QML项目开发过程中 xff0c 有时候需要对控件大小和位置 进行人为调整 xff0c 因此设计该组件 该组件鼠标置于边框和顶点位置时鼠标样式对应改变 xff0c 拖动边框可修改该方向组件大小 xff0c 拖动顶点可修改组件处横纵向组件大小
  • QML 地图修改插件源码(五),Map添加自定义地图类型,并动态修改地图类型

    QML的地图Map中提供了属性activeMapType MapType用于设置当前地图的类型 xff0c 以OSM地图插件为例 xff0c OSM地图提供了多种地图类型 xff0c 下面介绍如何修改OSM插件的源码添加需要的地图类型 xf
  • Qt使用QQuaternion对空间矢量QVector3D进行旋转

    空间中的QVector3D既可以代表空间中的点位置 xff0c 也可以表示空间矢量 为什么要对空间矢量进行旋转呢 xff0c 比如有一个空间矢量在空间中代表了镜头前进的方向 xff08 即第一人称模式 xff09 xff0c 初始时该矢量指
  • QML实现双屏显示

    QML程序中需要分别在主屏幕和分屏幕上显示不同的界面内容 xff0c 但又为了不同界面间能够进行数据交互 xff0c 因此使用如下方法实现双屏显示 xff0c 即由主窗口生成第二个窗口 xff0c 将该窗口移动到第二个屏幕上 xff0c 实
  • ubuntu设置默认内核启动的方法

    本文介绍ubuntu设置默认内核启动的方法 参考如下图 xff0c 修改grub文件 xff1a 修改后 xff0c 执行 xff1a sudo update grub amp amp reboot
  • QML自定义的日历控件

    QML中提供了日历的控件Calendar xff0c 但该控件为QtQuick Controls 1中提供的控件 xff0c 因此只能使用QtQuick Controls Styles的方式对该控件进行设置 xff0c 效果如图 xff1a
  • QML地图Map中使用QPainterPath,并显示任意点经纬度位置

    QML地图Map中提供了供绘制图形的组件 xff0c 例如MapPolyline xff0c MapCircle等 xff0c 但是这些组件在绘制复杂轨迹时就显得功能不够全面 xff0c 因此我将QPainterPath在Map中进行使用并
  • QML地图绘制虚线

    QML提供了MapPolyline用于在地图上绘制线段 xff0c 该线段是实线 xff0c 因此我使用Canvas自定义绘制的方式在地图上绘制线段 xff0c 如图 xff1a 鼠标在地图上点击后 xff0c 在点击位置添加图标 xff0