QT与javascript交互数据的实现


Posted in Javascript onMay 26, 2021

一、数据从QT流向JS
1、QT调用JS的函数,JS通过形参获得QT的值
2、JS调用QT的函数,QT函数的返回值进入JS
二、数据从JS流向QT
1、JS调用QT的函数,QT通过形参获得JS的值
2、QT调用JS的函数,JS函数的返回值进入QT

1、QT向JS传递数组

基本类型可以直接传递,例如 int bool string double等

qt向js传递数组,需要把数组转成QJsonArray,再把QJsonArray转成QString, 这样js就会接收到一个基本类型string,而这个string在js中直接就是一个标准的js数组。

QT代码示例:调用js函数,并给这个js函数传递一个数组作为参数

//方法1:构造QJsonArray,然后转成QString
    QJsonArray ja;
    ja << 3 << 4 << 5;
    QString jpar = QString(QJsonDocument(ja).toJson());
    QString cmd = QString("qtPara(%0)").arg(QString(QJsonDocument(ja).toJson()));
    //方法2:直接把数组写成string
//    QString cmd = QString("qtPara([13,14,15])");
 
    //运行js函数
    webView->page()->runJavaScript(cmd);

上面代码调用的javascript函数为:

function qtPara(numList)
 { 
  alert("js alert: " + numList);//显示qt传来的整个数组
  alert("js alert[0]: " + numList[0]);//显示qt传来数组第0个元素
 }

2、JS向QT传递数组

JS如果向QT传递数组,那么QT就要把这个值转成 QJsonArray

JS还可以向QT传递任意JS对象,那么QT要转成QJsonObject

QT端示例代码:

QString cmd = QString("jsString()");
 
    webView->page()->runJavaScript(cmd, [](const QVariant &v)
    {
        //情形1:当js返回数字时
        qDebug() << "qt call js = " << v.toDouble();
        //情形2:当js返回string值时
        qDebug() << "qt call js = " << v.toString();
        //情形3:当js返回 js数组时        
        QJsonArray ja = v.toJsonArray();
        qDebug() << "j[0] = " << ja.at(0).toDouble();
        //情形4:当js返回 js 对象时        
        QJsonObject jo = v.toJsonObject();
        qDebug() << jo;
    });

上述代码所调用的JS端的函数:

// var jArr = [120.123456789, 22, 33, 44];//js array
 // var jObj = {"num":[120.123456789, 22, 33, 44], "name":"Tom"};//json
var jNum = 120.1234567;
 function jsString()
 {
   alert("jsString");
   //return jNum ;
   //return jArr;
   //return jObj;
 }

3、JS向QT传递任意类型数据

QT端用QVariant类型来接收,然后qDebug这个值,就能看到这个JS值是如何被封装为QVariant的,然后我们就能

例如,JS向QT返回一个这样的值,这是一个JS对象数组,每个元素都是一个Point对象,且这个Point对象有lng和lat属性值。

path = [new Point(116.387112,39.920977), new  Point(116.387112,39.920977)];

QT接收到以后qDebug它,如下:

QVariant(QVariantList,
(QVariant(QVariantMap, QMap(("lat", QVariant(double, 39.921))("lng", QVariant(double, 116.387)))),
QVariant(QVariantMap, QMap(("lat", QVariant(double, 39.921))("lng", QVariant(double, 116.387))))))

我们发现,

① QT把JS的对象数组,封装成了QVariantList, 也即QList<QVariant>,

② 这个list的每个成员又都被QT封装成了QVariantMap, 也即QMap<QString, QVariant>

③ 每个map中的key都是QString,value都是QVariant,且这个QVariant是double。

经过上述分析步骤,我们就可轻易地解析出JS向QT传来的任意数据了。

到此这篇关于QT与javascript交互数据的实现的文章就介绍到这了,更多相关QT与javascript交互 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Jquery 基础学习笔记
May 29 Javascript
JS控制输入框内字符串长度
May 21 Javascript
javascript设计模式Constructor(构造器)模式
Aug 19 Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
Jan 10 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
Nov 14 Javascript
详解node.js 下载图片的 2 种方式
Mar 02 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 Javascript
jQuery AJAX与jQuery事件的分析讲解
Feb 18 jQuery
Vue.js计算机属性computed和methods方法详解
Oct 12 Javascript
Vue学习之常用指令实例详解
Jan 06 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
Feb 19 Javascript
前端vue+elementUI如何实现记住密码功能
Sep 20 Javascript
小程序实现筛子抽奖
详解vue身份认证管理和租户管理
ES6 解构赋值的原理及运用
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
js Proxy的原理详解
May 25 #Javascript
解析原生JS getComputedStyle
80行代码写一个Webpack插件并发布到npm
You might like
多文件上传的例子
2006/10/09 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
PHP实现合并discuz用户
2015/08/05 PHP
php实现zip文件解压操作
2015/11/03 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
可简单避免的三个JS发布错误的详细介绍
2013/08/02 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
JavaScript实现短暂提示框功能
2018/04/04 Javascript
angular2 组件之间通过service互相传递的实例
2018/09/30 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
九步学会Python装饰器
2015/05/09 Python
python3爬取数据至mysql的方法
2018/06/26 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
牦牛毛户外探险服装:Kora
2019/02/08 全球购物
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
梅西百货官网:Macy’s
2020/08/04 全球购物
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
中专毕业个人的自荐信格式
2013/09/21 职场文书
触电现场处置方案
2014/05/14 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
公务员培的训心得体会
2014/09/01 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
zabbix监控mysql的实例方法
2021/06/02 MySQL
python实现简单的聊天小程序
2021/07/07 Python