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 相关文章推荐
菜鸟学习JavaScript小实验之函数引用
Nov 17 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
Aug 02 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
Nov 02 Javascript
jQuery中replaceWith()方法用法实例
Dec 25 Javascript
JavaScript编写推箱子游戏
Jul 07 Javascript
详解js中构造流程图的核心技术JsPlumb
Dec 08 Javascript
js老生常谈之this,constructor ,prototype全面解析
Apr 05 Javascript
JavaScript实现图片自动加载的瀑布流效果
Apr 11 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
Jun 28 Javascript
js实现Tab选项卡切换效果
Jul 17 Javascript
JS利用prototype给类添加方法操作详解
Jun 21 Javascript
小程序实现密码输入框
Nov 16 Javascript
小程序实现筛子抽奖
详解vue身份认证管理和租户管理
ES6 解构赋值的原理及运用
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
js Proxy的原理详解
May 25 #Javascript
解析原生JS getComputedStyle
80行代码写一个Webpack插件并发布到npm
You might like
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
php防止SQL注入详解及防范
2013/11/12 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
PHP实现的json类实例
2015/07/28 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
JavaScript中Object值合并方法详解
2017/12/22 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
详解html-webpack-plugin插件(用法总结)
2018/09/12 Javascript
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
python聊天程序实例代码分享
2013/11/18 Python
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
python实现百度OCR图片识别过程解析
2020/01/17 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
Python使用Pygame绘制时钟
2020/11/29 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
药剂学专业应届生自荐信
2013/09/29 职场文书
工地安全检查制度
2014/02/04 职场文书
上课玩手机检讨书
2014/02/08 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL