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 相关文章推荐
图片自动缩小 点击放大
Jul 07 Javascript
写出更好的JavaScript之undefined篇(上)
Nov 22 Javascript
javascript实现文字图片上下滚动的具体实例
Jun 28 Javascript
jQuery.extend 函数及用法详细
Sep 06 Javascript
AngularJS模块学习之Anchor Scroll
Jan 19 Javascript
php基于redis处理session的方法
Mar 14 Javascript
基于pako.js实现gzip的压缩和解压功能示例
Jun 13 Javascript
angular.js中解决跨域问题的三种方式
Jul 12 Javascript
React如何将组件渲染到指定DOM节点详解
Sep 08 Javascript
利用JavaScript的%做隔行换色的实例
Nov 25 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
Sep 17 Javascript
前端使用crypto.js进行加密的函数代码
Aug 16 Javascript
小程序实现筛子抽奖
详解vue身份认证管理和租户管理
ES6 解构赋值的原理及运用
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
js Proxy的原理详解
May 25 #Javascript
解析原生JS getComputedStyle
80行代码写一个Webpack插件并发布到npm
You might like
php ios推送(代码)
2013/07/01 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
js中document.getElementByid、document.all和document.layers区分介绍
2011/12/08 Javascript
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
根据json字符串生成Html的一种方式
2013/01/09 Javascript
jquery实现用户打分评分特效
2015/05/28 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
2016/11/17 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
2019/08/16 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
通过实例了解Javascript柯里化流程
2020/03/03 Javascript
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python访问纯真IP数据库脚本分享
2015/06/29 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
Python实现汇率转换操作
2020/05/03 Python
PyQt5实现登录页面
2020/05/30 Python
浅谈Python中的字符串
2020/06/10 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
python 简单的调用有道翻译
2020/11/25 Python
pytorch 中forward 的用法与解释说明
2021/02/26 Python
小学综合实践活动总结
2014/07/07 职场文书
幼儿园辞职书
2015/02/26 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP