qt与javascript交互数据

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

② 这个list的每个成员又都被QT封装成了QVariantMap, 也即QMap<QString, QVariant>

③ 每个map中的key都是QString,value都是QVariant,且这个QVariant是double。

经过上述分析步骤,我们就可轻易地解析出JS向QT传来的任意数据了。
————————————————

posted @   希腊若蝶  阅读(722)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
点击右上角即可分享
微信分享提示