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 相关文章推荐
asp.net+jquery滚动滚动条加载数据的下拉控件
Jun 25 Javascript
jQuery.buildFragment使用方法及思路分析
Jan 07 Javascript
JavaScript中的Web worker多线程API研究
Dec 06 Javascript
node.js中的querystring.stringify方法使用说明
Dec 10 Javascript
jquery中radio checked问题
Mar 16 Javascript
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
javascript实现平滑无缝滚动
Aug 09 Javascript
在JavaScript中对HTML进行反转义详解
May 18 Javascript
JS实现获取当前URL和来源URL的方法
Aug 24 Javascript
详解基于javascript实现的苹果系统底部菜单
Dec 02 Javascript
node.js处理前端提交的GET请求
Aug 30 Javascript
微信小程序利用button控制条件标签的变量问题
Mar 15 Javascript
小程序实现筛子抽奖
详解vue身份认证管理和租户管理
ES6 解构赋值的原理及运用
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
js Proxy的原理详解
May 25 #Javascript
解析原生JS getComputedStyle
80行代码写一个Webpack插件并发布到npm
You might like
php中判断数组是一维,二维,还是多维的解决方法
2013/05/04 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
解析thinkphp import 文件内容变量失效的问题
2013/06/20 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
2015/12/02 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
JQuery实现定时刷新功能代码
2017/05/09 jQuery
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
webstorm添加*.vue文件支持
2018/05/08 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
python实现数组插入新元素的方法
2015/05/22 Python
Python基于PycURL实现POST的方法
2015/07/25 Python
python采用django框架实现支付宝即时到帐接口
2016/05/17 Python
如何在python中使用selenium的示例
2017/12/26 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
什么是Python中的顺序表
2020/06/02 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
Python调用C语言程序方法解析
2020/07/07 Python
真正了解CSS3背景下的@font face规则
2017/05/04 HTML / CSS
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
学习实践科学发展观心得体会
2014/09/10 职场文书