本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

qt与javascript交互数据

发布于2021-05-30 12:56     阅读(1584)     评论(0)     点赞(5)     收藏(1)


一、数据从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. //方法1:构造QJsonArray,然后转成QString
  2. QJsonArray ja;
  3. ja << 3 << 4 << 5;
  4. QString jpar = QString(QJsonDocument(ja).toJson());
  5. QString cmd = QString("qtPara(%0)").arg(QString(QJsonDocument(ja).toJson()));
  6. //方法2:直接把数组写成string
  7. // QString cmd = QString("qtPara([13,14,15])");
  8. //运行js函数
  9. webView->page()->runJavaScript(cmd);

 

上面代码调用的javascript函数为:

  1. function qtPara(numList)
  2. {
  3. alert("js alert: " + numList);//显示qt传来的整个数组
  4. alert("js alert[0]: " + numList[0]);//显示qt传来数组第0个元素
  5. }

 

2、JS向QT传递数组

JS如果向QT传递数组,那么QT就要把这个值转成 QJsonArray

JS还可以向QT传递任意JS对象,那么QT要转成QJsonObject

QT端示例代码:

  1. QString cmd = QString("jsString()");
  2. webView->page()->runJavaScript(cmd, [](const QVariant &v)
  3. {
  4. //情形1:当js返回数字时
  5. qDebug() << "qt call js = " << v.toDouble();
  6. //情形2:当js返回string值时
  7. qDebug() << "qt call js = " << v.toString();
  8. //情形3:当js返回 js数组时
  9. QJsonArray ja = v.toJsonArray();
  10. qDebug() << "j[0] = " << ja.at(0).toDouble();
  11. //情形4:当js返回 js 对象时
  12. QJsonObject jo = v.toJsonObject();
  13. qDebug() << jo;
  14. });

上述代码所调用的JS端的函数:

  1. // var jArr = [120.123456789, 22, 33, 44];//js array
  2. // var jObj = {"num":[120.123456789, 22, 33, 44], "name":"Tom"};//json
  3. var jNum = 120.1234567;
  4. function jsString()
  5. {
  6. alert("jsString");
  7. //return jNum ;
  8. //return jArr;
  9. //return jObj;
  10. }

 

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它,如下:

  1. QVariant(QVariantList,
  2. (QVariant(QVariantMap, QMap(("lat", QVariant(double, 39.921))("lng", QVariant(double, 116.387)))),
  3. 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传来的任意数据了。

 

 

 

 

 

原文链接:https://blog.csdn.net/qq_31073871/article/details/117221539




所属网站分类: 技术文章 > 博客

作者:Jjxj

链接:http://www.qianduanheidong.com/blog/article/116129/b8b9c10a4d9d5ef7f9fe/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

5 0
收藏该文
已收藏

评论内容:(最多支持255个字符)