Qt编写地图综合应用8-地图交互
一、前言
最常用的地图交互就几个,比如鼠标在地图上按下的时候可以拾取经纬度坐标,然后传给Qt程序,再比如对设置的设备点进行单击的时候,通知Qt程序单击了哪一个设备点,好让Qt程序识别并作出反应比如弹出对应点的详细信息或者视频预览等。让网页执行js函数这种单向的操作,其实无论何种浏览器内核都支持的,并不需要注入类或者添加qwebchannel.js文件之类的,你只需要放心大胆的调用runJavaScript或者evaluateJavaScript函数。而如果想要网页发送对应的数据给Qt程序的话,就需要额外的处理了。
在webkit中要实现从网页传回数据交互,只需要在网页载入完毕的信号loadFinished中注入类对象即可 webView->page()->mainFrame()->addToJavaScriptWindowObject("objName", webJsData);,而在webengine控件中需要增加两步,第一步是需要在网页里面引入js文件 <script type="text/javascript" src="qwebchannel.js">,第二步是生成QWebChannel通信对象 new QWebChannel(qt.webChannelTransport, function(channel){window.receiveData = channel.objects.receiveData;}),第三步是注入类对象 QWebChannel *channel = new QWebChannel(this);channel->registerObject("objName", webJsData); webView->page()->setWebChannel(channel);
做完了上面的注入类以后,在网页中写好对应的window.receiveData即可,receiveData为对应的类的public的槽函数,这里为了复用所有的数据传回的情况,特意写了通用的receiveData函数,void receiveData(const QString &type, const QVariant &data);定义两个参数,这样就涵盖了所有的情况 type表示类型相当于唯一标识,而data是QVariant类型,即可以是字符串也可以是整数或者数组,都能自动转换的,这样的话就一个类涵盖了所有的各种可能的情况,都可以通过type来区分,通过data的类型去判断并转换数据。
二、功能特点
- 同时支持在线地图和离线地图两种模式。
- 同时支持webkit内核、webengine内核、IE内核。
- 支持设置多个标注点,信息包括名称、地址、经纬度。
- 可设置地图是否可单击、拖动、鼠标滚轮缩放。
- 可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。
- 可设置地图缩放比例和级别,缩略图、比例尺、路况信息等控件的可见。
- 支持地图交互,比如鼠标按下获取对应位置的经纬度。
- 支持查询路线,可设置起点位置、终点位置、路线模式、路线方式、路线方案(最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速)。
- 可显示点线面工具,可直接在地图上划线、点、矩形、圆形等。
- 可设置行政区划,指定某个城市区域绘制图层,在线地图自动输出行政区划边界点集合到js文件给离线地图使用。
- 可静态或者动态添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。
- 函数接口友好和统一,使用简单方便,就一个类。
- 支持js动态交互添加点、删除点、清空点、重置点,不需要刷新页面。
- 支持任意Qt版本、任意系统、任意编译器。
三、体验地址
- 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 名称:bin_map.zip
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
- 个人主页:https://blog.csdn.net/feiyangqingyun
- 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
四、效果图

五、相关代码
//需要自定义继承自QObject的类来接收QWebEngineView交互数据,不然会打印很多烦人的信息
class WebJsData : public QObject
{
Q_OBJECT
public:
static WebJsData *Instance();
explicit WebJsData(QObject *parent = 0);
public slots:
//定义两个参数,这样就涵盖了所有的情况 type表示类型相当于唯一标识
void receiveData(const QString &type, const QVariant &data);
signals:
void receiveDataFromJs(const QString &type, const QVariant &data);
};
WebJsData *WebJsData::Instance()
{
static WebJsData self;
return &self;
}
WebJsData::WebJsData(QObject *parent)
{
}
void WebJsData::receiveData(const QString &type, const QVariant &data)
{
//可以在这里重新梳理好再发出去信号
emit receiveDataFromJs(type, data);
}
list << QString(" map.addEventListener(\"click\", function(e) {");
list << QString(" window.%1('point', e.point.lng + \",\" + e.point.lat);").arg(callFun);
list << QString(" });");
//自定义方法显示标注详细信息
list << QString(" function addInfoWindow(marker, poi){");
list << QString(" var title = '<div style=\"color:#CE5521;\">' + poi.name + '</div>';");
list << QString(" var list = [];");
list << QString(" list.push('<table><tr style=\"vertical-align:top;line-height:25px;font-size:12px;\">');");
list << QString(" list.push('<td style=\"white-space:nowrap;word-break:keep-all;\">地址:</td>');");
list << QString(" list.push('<td>' + poi.addr + '</td>');");
list << QString(" list.push('</tr></table>');");
list << QString(" var infoWindow = new BMap.InfoWindow(list.join(\"\"),{title:title, width:60});");
//单击以后弹出提示信息或者发送信号出去
list << QString(" var markerClick = function() {");
#if 0
list << QString(" marker.openInfoWindow(infoWindow);");
#else
list << QString(" window.%1('marker', poi.name);").arg(callFun);
#endif
list << QString(" };");
//添加单击监听器
list << QString(" marker.addEventListener(\"click\", markerClick);");
list << QString(" }");
Qt编写地图综合应用8-地图交互的更多相关文章
- Qt编写可拖动对象+背景地图+多种样式+多种状态(开源)
在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,为此特意编写本控件,全部开源出来,欢迎大家提建议.同时多多支持整套自定义控件 ...
- Qt编写的开源帖子集合(懒人专用)
回顾自己学习Qt以来九年了,在这九年多时间里面,从本论坛学习不到不少的东西,今天特意整了一下自己开源过的资源的帖子,整理一起方便大家直接跳转下载,不统计不知道,一统计吓一跳,不知不觉开源了这么多代码, ...
- Qt开发北斗定位系统融合百度地图API及Qt程序打包发布
Qt开发北斗定位系统融合百度地图API及Qt程序打包发布 1.上位机介绍 最近有个接了一个小型项目,内容很简单,就是解析北斗GPS的串口数据然后输出经纬度,但接过来觉得太简单,就发挥了主观能动性,增加 ...
- 多种在线地图综合对比,Google,必应,arcgis Online...
不同网络地图的对比 天地图 坐标系:WGS84 地图配色: POI数量:丰富 有无建筑:有 地图特点:天地图按照国家标准进行配图,道路.水系.植被等图层用对应颜色渲染, POI信息丰富, ...
- Qt编写自定义控件二动画按钮
现在的web发展越来越快,很多流行的布局样式,都是从web开始的,写惯了Qt widgets 项目,很多时候想改进一下现有的人机交互,尤其是在现有的按钮上加一些动画的效果,例如鼠标移上去变大,移开还原 ...
- Qt编写项目作品大全(自定义控件+输入法+大屏电子看板+视频监控+楼宇对讲+气体安全等)
一.自定义控件大全 (一).控件介绍 超过160个精美控件,涵盖了各种仪表盘.进度条.进度球.指南针.曲线图.标尺.温度计.导航条.导航栏,flatui.高亮按钮.滑动选择器.农历等.远超qwt集成的 ...
- Qt编写安防视频监控系统(界面很漂亮)
一.前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅 ...
- Qt编写自定义控件11-设备防区按钮控件
前言 在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,安防领域一般用来表示防区或者设备,可以直接显示防区号,有多种状态颜色指 ...
- Qt编写数据可视化大屏界面电子看板系统
一.前言 目前大屏大数据可视化UI这块非常火,趁热也用Qt来实现一个,Qt这个一站式超大型GUI超市,没有什么他做不了的,大屏电子看板当然也不在话下,有了QSS和QPainter这两个无敌的工具组合, ...
- Qt编写安防视频监控系统18-云台控制
一.前言 云台控制是视频监控系统中必备的一个功能,对球机进行上下左右的移动,还有焦距的控制,其实核心就是控制XYZ三个坐标轴,为了开发这个模块,特意研究了各种云台控制的方法和开源库比如soap,有些厂 ...
随机推荐
- 鸿蒙Flutter实战:01-搭建开发环境
鸿蒙Flutter实战:01-搭建开发环境 准备工作 1.安装 DevEco Studio NEXT IDE, 注意版本应该是 Next,当前最新的是 Beta3 2.安装Git, 如果要同时适配安卓 ...
- 带你了解nginx功能
关于Nginx 简介 功能 基本的HTTP服务器功能 其他HTTP服务器功能 邮件代理服务器功能 TCP / UDP代理服务器功能 架构和可扩展性 适用平台 简介 Nginx (engine x) 是 ...
- EAFP 与 LBYL 风格
EAFP 与 LBYL 是两种"防御性处理机制",相信你一定接触过,只是可能没有深入思考过这个问题. 输入两个数,要输出相除后的结果: a, b = map(int, input( ...
- 开源 PHP 商城项目 CRMEB 安装和使用教程
说到电商系统,很多人第一反应可能是 Shopify 或 Magento.没错,这些平台确实功能强大,但是...它们也太强大了,不仅复杂还昂贵,对于刚起步的创业者来说简直是压力山大. 但是从零开始开发一 ...
- .NET周刊【11月第1期 2024-11-03】
国内文章 .NET 9 AOT的突破 - 支持老旧Win7与XP环境 https://www.cnblogs.com/lsq6/p/18519287 .NET 9 引入了 AOT 支持,使得应用程序能 ...
- 13-2 c++拷贝控制和资源管理
目录 13.2.1 行为像值的类 类拷贝赋值运算符的编写 13.2.2 定义行为像指针的类 引用计数 定义一个使用引用计数的类 为了定义这些成员,我们首先必须确定此类型对象的拷贝语义.一般来说,有两种 ...
- 抓包工具之MitmProxy
官方文档: https://mitmproxy.org/ github:https://github.com/mitmproxy/mitmproxy 缘起: 之前使用过几个抓包工具, 例如fiddle ...
- highcharts在vue中的应用
1.安装命令 npm install highcharts --save 2.在页面中按需引入 import Highcharts from 'highcharts/highstock'; impor ...
- Vue.js 过渡 & 动画
1.前言 Vue动画/过渡的本质: 在通过v-if/v-show指令插入/移除/显示/隐藏某个标签元素时,在这个标签上包裹一个transition标签,Vue会为这个标签动态添加css类名,为这些类名 ...
- DTL事务控制语言--sql事务
DTL事务控制语言体格sql语句就是一个事务事务可以保证 一组sql语句要么都成功,要么都失败默认自动提交一可以关闭 set autocommit=0关闭自动提交最后 插入或者修改时 只有commit ...