当前位置:编程学习 > > 正文

qt和js相互调用(QT与javascript交互数据的实现)

时间:2022-01-25 00:13:44类别:编程学习

qt和js相互调用

QT与javascript交互数据的实现

一、数据从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交互 内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐