Qt的QWebChannel和JS、HTML通信/交互驱动百度地图

0 前言

我一个研究嵌入式的,不知道怎么就迷上了上位机,接了几个项目都是关于Qt,这个项目还是比较经典的,自己没事儿的时候也进行研究,对这个软件进行升级,反正,我喜欢编程,喜欢研究这些东西。研究了一下午,查了很多资料,看了很多的例子,我对于JS是0基础,能稍微看懂一点点HTML语言的东西,下午调试了好几遍,运行了好几遍,终于在我更改了JavaScript的函数完毕之后,一下子数据回传成功了,那种感觉很棒!!!特地写这个博客,记录我的研发成果。

我是一个业余研究Qt的,不是那么专业! *

【正文】

QWebChannel官方给的例子是和Socket混合,看的是一头雾水,不得不吐槽Qt了,能不能单独讲讲使用方法,别和别的东西结合?!

对于我的GPS地图项目,研究又有了新的进展,我在本年度一直在业余时间研究Qt开发的软件和网页交互(JS和HTML),虽然我对于网页的知识仅仅有个基础,在业余方面,我也不断的在对该软件进行升级研究,目前状态:

第一阶段:在Qt5.6以下版本,Qt还没有删除QWebKits组件,基于QWebKits组件,我做了最基本的软件:参考:Qt开发北斗定位系统融合百度地图API及Qt程序打包发布,

第二阶段:Qt5.6以上版本,删除了QWebKits组件,升级为QWebEngine组件,但是过渡阶段只能由Qt的C++程序去运行JS,JS反馈的数据无法回传,这造成了我获取当前鼠标经纬度的功能缺失。参考:QtWebkits如何向QtWebEngine过渡。

第三阶段:基于第二个阶段,依旧基于QWebEngine,引入QWebChannel通信机制,完成JavaScript给的回传数据,还原了鼠标当前经纬度的获取功能。

到目前为止,GPS定位系统交互驱动百度地图已经完全适配QWebEngine组件。

如图1:

红色方框部分为当前鼠标的经纬度信息,这个信息来源于html访问百度地图的JavaScript,然后回传给C++的信息。

本文重点来说一下,如何从JavaScript获取回传信息,实现交互

1 实现过程

1.1 原理阐述

我是非专业的,我也没有找关于HTML和JS交互的书,在我研究的过程中我认为是一个这样的关系:

QWebEngine提供了调用HTML里面JavaScript的方法,这里HTML像是一个接口,在HTML尾部有一个这样的标签, ,在这个标签内的函数和变量体中写入一些函数和变量,这些函数和变量要么是JavaScript中的调用,要么是Qt中的调用,所以,HTML像是一个QT和网页的桥梁。在下面的章节,我们详细讨论一下步骤。

1.2 WebChannel的使用

要使用QWebChannel要打点好两个方面,第一,Qt方面,需要包含QWebChannel类,注册好QWebChannel需要连接的Qt的对象;第二,JS方面,官方提供了配套的qwebchannel.js文件,这个js文件就相当于驻JavaScript负责通信的。所需准备的:

【JS方面:】qwebchannel.js文件(Qt官方提供,需要在html中引入,拿到后里面什么代码都不要修改,直接使用。) qwebchannel.js下载地址

【Qt方面:】在Qt的主程序中,创建好QWebChannel类

下面就这两方面讨论如何使用:

1.2.1 JS方面处理

地图这块仅有一个JavaScript文件,是驱动百度地图的,但是为了让QWebChannel和百度的JS顺利通信,Qt提供了一个qwebchannel.js文件,这个文件就是负责打点Qt和JS通信用的。

参考源码:我把qwebchannel.js放在和百度地图提供的js(也就是你要通信的JS)放在了一个目录,然后在HTML文件中要引入两个js文件。

地图演示

这么多代码,看的你很焦躁,不用太细研究,里面只是定义了很多百度地图读取的方法,我们把重点放在几个点上(你可以在上面的源码注释中找到重点标记)

【第1步】:,这两个语句表示这个HTML负责驱动两个js文件,一个是百度地图的js文件,一个是qwebchannel的js文件,qwebchannel毋庸置疑就是负责交互数据的了,所以在你拿到百度地图原版的HTML文件的时候,需要对这里进行改进,原理貌似就像是C语言中#include这块,把qwebchannel.js集成进来。

【第2步】:需要在JS这块创建一个QWebChannel,这个js里的webchannel就是负责和Qt C++里面的webchannel通信的。

// !!!!重点2!!!

new QWebChannel(qt.webChannelTransport, // 新建一个QWebChannel实例化

function(channel){

window.bridge = channel.objects.person; // 注册 // window.bridge不用找了,这个是js的功能函数,等号后边需要注意,channel.objects.XXXXX

} // 这个XXXX是需要在Qt C++程序里面定义的,我们一会儿说,但是channel.objects.这个是固有的。

);

这部分是新添加的,我查了QWebChannel这个东西在qwebchannel.js文件中定义了,这里在我们要访问的HTML中必须要有这个东西的定义,解释详见注释。person这个东西就是在C++里面定义的,就当是他是负责和我们C++和js通信的句柄吧。将他赋值给window.bridge,以后利用操作window.bridge我们就可以通信了。

【第3步】:利用channel这个东西通信。

// !!!!重点3!!!

var updateInfo = function(lng,lat)

{

window.bridge.getCoordinates(lng,lat);

}

这里定义一个函数,就是将lng和lat这两个参数传递给Qt C++,通过这样的方式就能回传数据了。window.bridge说过了是固有的,js固有的,那么getCoordinates这个东西是什么?答曰,是我们Qt C++里面自定义的一个槽函数,声明在public slots:里面,channel通过window.bridget来操控槽函数,达到数据回传,这个地方是重中之重!!

【第4步】:配合监听器,这里有个注意点。

// !!!!!重点4!!!

map.addEventListener("mousemove",function(e) {

updateInfo(e.point.lng,e.point.lat);

});

当发生mousemove这个行为的时候,这可能是JS里面的知识,则调用function(e),一定要注意这个function不能直接把函数体写在这里,必须采用我们上面的方法,把函数体单独写,然后在内部写上调用。

到此javascript部分已经交代清楚了。

1.2.2 Qt C++方面处理

Qt C++方面的开发,需要启动QWebChannel类,注册页面。

// 准备Javascript文件交互

QString strMapPath = "qrc:/map/map.html"; // 设定地图路径

QWebEnginePage *page = new QWebEnginePage(this); // 定义QWebEnginePage界面负责打开html文件

QWebChannel *channel = new QWebChannel(this); // 定义QWebChannel负责

channel->registerObject(QString("person"),this); // QWebChannel对Widget类,注册一个person的通信介质 /

// 在js文件中person负责成为window.bridge /

// 在this中也就是Widget类注册channel,channel访问的位Widget下的槽函数。

page->load(strMapPath); // webenginePage加载html地图。

page->setWebChannel(channel); // webenginePage加载Channel功能

ui->webEngine->setPage(page); // ui显示该page。

在C++类Widget的构造函数,要进行准备,这里涉及了QWebEnginePage,QWebChannel,千万别乱,按照代码注释里清楚关系。这里有个QString类,定义了person,在返回去看js中的person,是不是明白了其中的联系了?!你可以写成任意可理解的字符。

紧接着就是槽函数了:必须是public slots: 不能是private slots

public slots:

void getCoordinates(QString lon, QString lat) {

QString tempLon="Mouse Lontitude:"+lon+"°";

QString tempLat="Mouse Lattitude:"+lat+"°";

ui->label_mouse_altitude->setText(tempLat);

ui->label_mouse_latitude->setText(tempLon);

};

经过以上,js会回传数据给lon和lat,然后你该怎么办就怎么办了。

2 总结

经过一下午的努力,完成了数据回传,可以将js的数据传递回来,但是QWebChannel这块还有其他的东西,比如和槽和信号连接,如果今后能遇到这个项目,我会继续研究,否则,到今天这个项目完毕。

感谢观看。

参考文献:

【木有】

版权声明:

1. 本文为MULTIBEANS团队研发跟随文章,未经允许不得转载。

2· 文中涉及的内容若有侵权行为,请与本人联系,本人会及时删除。

3· 尊重成果,本文将用的参考文献全部给出,向无私的工程师,爱好者致敬。

qt百度地图html,Qt的QWebChannel和JS、HTML通信/交互驱动百度地图相关推荐

  1. QT+高德地图Web服务API开发—静态地图开发Demo。QT组件提升、QT鼠标事件处理、Qt图片显示与移动、QT网络操作

    说明 在本次项目中,我们使用QT开发框架,高德地图Web服务地图API,完成一个项目Demo,进行一次对QT.对编程的学习. 本系类文章所包含内容包括: 1.QT组件提升 2.QT鼠标事件处理 3.Q ...

  2. python qt教程_Python - Python Qt 开发教程(1)

    前言写文章之前我都喜欢加个前言,说说自己的感受,这次也不例外. 这篇文章是学习 Python Qt 半年来出的教程,因此教程的质量并不能保证,只是将自己的经验分享给大家. Python Qt 图形界面 ...

  3. 【全教程】qt连接mysql——从qt编译mysql驱动到qt连接mysql数据库(一、编译连接前准备)

    一.说明 电脑系统:win10 qt版本:5.13.2和5.14.1(测试均成功) mysql版本:MySQL-5.5 本篇教程分为三个部分: [全教程]qt连接mysql--从qt编译mysql驱动 ...

  4. Hello Qt(一)——QT简介

    一.QT简介 1.QT简介 QT是一个跨平台的C++图形用户界面库,由挪威TrollTech公司出品,目前包括Qt Creator, QtEmbedded,Qt Designer快速开发工具,Qt L ...

  5. Qt终极教程——用Qt编程实现中国象棋游戏(提供源代码和程序编译运行教程)

    Qt终极教程--用Qt编程实现中国象棋游戏 目录 Qt终极教程--用Qt编程实现中国象棋游戏 简介 运行可执行程序体验象棋游戏 Qt 安装 源代码的编译.运行与调试 生成预编译的可执行程序 简介 本文 ...

  6. C++后续:QT学习(Qt概述,创建QT项目)

    目录 声明 一. Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt支持的平台 1.4 Qt版本 1.5 Qt的下载与安装 1.6 Qt的优点 二.创建 Qt项目 2.1 如何创建 2. ...

  7. qt调用linux系统调用,qt在其他函数调用数据库

    <多核与GPU编程:工具.方法及实践>----3.2 线程 本节书摘来自华章出版社<多核与GPU编程:工具.方法及实践>一书中的第3章,第3.2节, 作 者 Multicore ...

  8. Windows单独安装QT及VS和QT联合开发环境安装

    Windows单独安装QT及VS和QT结合开发环境安装 Windows单独安装QT及VS和QT结合开发环境安装 一.前言 二.单独安装QT开发环境: 三.安装VS并配置QT环境变量: 四.给QT设置环 ...

  9. Qt学习笔记,Qt国际化

    Qt学习笔记,Qt国际化 Qt国际化步骤: 第一步:设置.pro文件,加入TRANSLATIONS为国际化做准备 TRANSLATIONS = language/language_en.ts\     ...

最新文章

  1. Swift字符串基本操作(三)
  2. 【数理知识】《数值分析》李庆扬老师-第7章-非线性方程与方程组的数值解法
  3. 消息队列 策略_消息队列技术点梳理(思维导图版)
  4. oracle 格式化报表输出,perl的格式化(Format)报表输出实现代码
  5. OpenWrt——配置L2TP客户端
  6. 在WPF程序中打开网页:使用代理服务器并可进行JS交互
  7. 消息发送到消息接收的整体流程
  8. ac ap方案 华为_华为无线_AC+AP小型无线网络配置实验_v1
  9. 黑客攻防技术宝典Web实战篇第2版—第3章 Web应用程序技术
  10. icmp时间戳请求和应答程序实现_ICMP报文详解之ping实现
  11. python打开jpg照片_python打开图像
  12. YOLO v2详细解读
  13. python selenium+firefox对网页截长图
  14. 图片存档和通信系统(PACS)的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  15. 前端速成:双月Java之旅(week5)_day1
  16. C++一本通题库1008
  17. s60 微信 服务器繁忙,微信Mars — 移动互联网下的高质量网络连接探索
  18. 从雨天塞车说DevOps,兼修订三步生活法
  19. knn K近邻算法python实现
  20. 深度学习常见中英文术语解释

热门文章

  1. c/c++比较灵活的方法:回调函数和函数指针
  2. Vmware Ubuntu 自适应屏幕 进入全屏模式
  3. C++四种强制类型转换 dynamic_cast,const_cast,static_cast,reinterpret_cast
  4. 导入依赖和加上注释后,lombok gettersetter识别不到
  5. Hive的安装【完整版】
  6. 使用crontab定时保存top信息到文件,并保存到数据库中
  7. maven项目创建过慢解决
  8. leetcode 676. Implement Magic Dictionary | 676. 实现一个魔法字典(DFS+Trie 前缀树)
  9. leetcode 19. Remove Nth Node From End of List | 19. 删除链表的倒数第 N 个结点(Java)
  10. leetcode 228. 汇总区间(Java版)