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 相关文章推荐
让firefox支持IE的一些方法的javascript扩展函数代码
Jan 02 Javascript
jquery实现人性化的有选择性禁用鼠标右键
Jun 30 Javascript
javascript中typeof操作符和constucor属性检测
Feb 26 Javascript
jQuery制作简洁的图片轮播效果
Apr 03 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
Apr 15 Javascript
详解Bootstrap按钮
Jan 04 Javascript
很不错的两款Bootstrap Icon图标选择组件
Jan 28 Javascript
详谈js遍历集合(Array,Map,Set)
Apr 06 Javascript
vue js秒转天数小时分钟秒的实例代码
Aug 08 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
Aug 09 jQuery
微信小程序云开发如何使用云函数生成二维码
May 18 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
Nov 18 jQuery
小程序实现筛子抽奖
详解vue身份认证管理和租户管理
ES6 解构赋值的原理及运用
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
js Proxy的原理详解
May 25 #Javascript
解析原生JS getComputedStyle
80行代码写一个Webpack插件并发布到npm
You might like
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
解析php常用image图像函数集
2013/06/24 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
Jquery注册事件实现方法
2015/05/18 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
js友好的时间返回函数
2016/08/24 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
12条写出高质量JS代码的方法
2018/01/07 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
Django跨域请求原理及实现代码
2020/11/14 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
Python实现粒子群算法的示例
2021/02/14 Python
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
医科大学毕业生自荐信
2014/02/03 职场文书
社团活动总结报告
2014/06/27 职场文书
学校安全责任书范本
2014/07/23 职场文书
员工安全责任书范本
2014/07/24 职场文书
旅游活动总结
2014/08/27 职场文书
委托证明书
2014/09/17 职场文书
毕业生自荐信范文
2015/03/05 职场文书
2016新年问候语大全
2015/11/11 职场文书
外出学习心得体会范文
2016/01/18 职场文书
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL