基本思路
- 百度官方提供了完整的第三方开发方案
- 基于html和JavaScript实现
- 可通过查看提供的API手册和开发指南实现地图功能模块的调用进而二次开发
与Qt结合的思路是
根据开发指南,编写基础html文件 ```html <!DOCTYPE html>
- 关于密钥:根据指南自行申请百度开发者帐号和密钥(限制调用的计算资源)
- 关于控件:地图上的小工具和功能均有对应API调用实现
- 关于交互:Line17 的`qwebchannel.js`文件可在Qt的安装目录下找到,拷贝到与该html同一级目录下
- 按需添加include,基本上根据类名会自动补全
<a name="m1xpX"></a>
# 程序细节
- 在Qt的.pro中添加如下
```cpp
QT += core gui webchannel webengine webenginewidgets network
ui设计添加QGraphicsView控件(此处命名graphicsView_map),并提升为QWebEngineView
QDir temDir("../baidumap.html"); QString absDir = temDir.absolutePath(); QString filePath = "file:///" + absDir; ui->graphicsView_map->page()->load(QUrl(filePath));
-
交互功能
JavaScript -> Qt
Qt添加WebChannel
- 这里新建了一个类bridge承接Qt中的方法与JavaScript中的方法的映射函数
- bridge.h
```cpp
ifndef BRIDGE_H
define BRIDGE_H
include
class bridge : public QObject { Q_OBJECT public: bridge(QObject *parent = nullptr);
public slots: void getCoordinate(QString lon,QString lat);
};
endif // BRIDGE_H
- bridge.cpp
```cpp
#include <QDebug>
#include "bridge.h"
#include "mainwindow.h"
bridge::bridge(QObject *parent) : QObject(parent)
{
}
void bridge::getCoordinate(QString lon, QString lat)
{
qDebug()<<lon<<lat;
}
在Qt加载地图网页部分添加
channel = new QWebChannel(this); qtJsBridge = new bridge(); channel->registerObject("bridge_name",(QObject*)qtJsBridge); ui->graphicsView_map->page()->setWebChannel(channel);
在html文件中添加
new QWebChannel( qt.webChannelTransport, function (channel) { window.bridge_js = channel.objects.bridge_name; //bridge_name 与QT 中一致 });
可以这样理解:通过
window.bridge_js = channel.objects.bridge_name
,使得在JavaScript中bridge_js
这个对象与标签bridge_name
所指向的Qt中的对象qtJsBridge实现对应此时,即可通过
bridge_js
调用qtJsBridge下的方法,注意该方法必须被声明在public slots:
下,猜测这里的交互实现本质上也是利用了Qt的信号槽函数机制Qt -> JavaScript
html文件以及其中的Javascript部分本质上属于Javascript脚本
因此从Qt调用Javascript的方法其实就是向脚本传递指令
QString jsCmd = QString( "add_point(\"%1\",\"%2.png\",%3,%4)" ) .arg(tempPoint->id) .arg(tempPoint->planeSet) .arg(tempPoint->longtitude) .arg(tempPoint->latitude); //send Js commond to html ui->graphicsView_map->page()->runJavaScript(jsCmd);
编辑字符串对应JavaScript中的函数,以及传入参数
需要注意如果传入参数中有字符串,需要在格式控制中添加转义引号
JavaScript补充
详细的扩展功能可参考开发指南的示例Demo
这里列举未提及的程序细节
地图的文本为字符串格式,支持加号运算符拼接,但格式和段落等需要参考html语法
- 例如换行不支持
\n
,而应当使用<p></p>
- 占位符使用
%emsp
等百度地图API
开发指南
https://lbsyun.baidu.com/index.php?title=jspopular3.0参考案例
QT实现加载百度离线地图
https://blog.csdn.net/John_kai/article/details/80290072
Qt开发北斗定位系统融合百度地图API及Qt程序打包发布
https://www.cnblogs.com/sigma0/p/7220334.html
Qt编写地图综合应用7-百度离线地图
https://cloud.tencent.com/developer/article/1612315
QWebEngineView与javaScript交互调用百度离线地图
https://blog.csdn.net/xx970829/article/details/119302379
Qt加载百度离线地图
https://blog.csdn.net/caoshangpa/article/details/51015483
使用百度地图JavaScript API构建离线地图应用(完整教程)
https://blog.csdn.net/geekxm/article/details/14227139
QT之调用百度地图离线API
https://blog.csdn.net/aitaoge/article/details/82425188
Qt开发北斗定位系统融合百度地图API及Qt程序打包发布
https://www.cnblogs.com/sigma0/p/7220334.html瓦片下载
百度离线地图瓦片图下载器(谷歌\腾讯\高德)
http://www.xiaoguo123.com/p/mapdownload/
百度离线地图使用
https://www.cnblogs.com/wjw1014/p/11345350.html离线地图资料
my_bmap(v2.0 api3.0 无瓦片地图备份).rar
全能地图下载3.0.zip
- 例如换行不支持