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初学者的编写开发的七个细节
Jan 11 Javascript
使用隐藏的new来创建对象
Mar 29 Javascript
jquery验证表单中的单选与多选实例
Aug 18 Javascript
探究JavaScript函数式编程的乐趣
Dec 14 Javascript
基于jquery实现表格内容筛选功能实例解析
May 09 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
Sep 06 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
Dec 16 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
Feb 27 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
Apr 28 Javascript
使用vue-router切换页面时实现设置过渡动画
Oct 31 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
Aug 31 Javascript
详解JavaScript的this指向和绑定
Sep 08 Javascript
小程序实现筛子抽奖
详解vue身份认证管理和租户管理
ES6 解构赋值的原理及运用
vue点击弹窗自动触发点击事件的解决办法(模拟场景)
js Proxy的原理详解
May 25 #Javascript
解析原生JS getComputedStyle
80行代码写一个Webpack插件并发布到npm
You might like
防止用户利用PHP代码DOS造成用光网络带宽
2011/03/01 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
jQuery bind事件使用详解
2011/05/05 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
2016/03/22 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
纯js实现隔行变色效果
2017/11/29 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
BootStrap中的模态框(modal,弹出层)功能示例代码
2018/11/02 Javascript
实例讲解JS中pop使用方法
2019/01/27 Javascript
微信小程序自定义toast组件的方法详解【含动画】
2019/05/11 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
Python使用MD5加密字符串示例
2014/08/22 Python
python实现根据月份和日期得到星座的方法
2015/03/27 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
浅析Python3中的对象垃圾收集机制
2019/06/06 Python
机器学习实战之knn算法pandas
2019/06/22 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
极度干燥澳大利亚官方网站:Superdry澳大利亚
2019/03/28 全球购物
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
数据管理员的自我评价分享
2013/11/15 职场文书
难忘的一天教学反思
2014/04/30 职场文书
给学校的建议书范文
2014/05/15 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
社区服务标语
2014/07/01 职场文书
公司经营目标责任书
2015/01/29 职场文书
介绍一下28个JS常用数组方法
2022/05/06 Javascript
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python