QT與javascript交互數(shù)據(jù)的實現(xiàn)
一、數(shù)據(jù)從QT流向JS
1、QT調(diào)用JS的函數(shù),JS通過形參獲得QT的值
2、JS調(diào)用QT的函數(shù),QT函數(shù)的返回值進入JS
二、數(shù)據(jù)從JS流向QT
1、JS調(diào)用QT的函數(shù),QT通過形參獲得JS的值
2、QT調(diào)用JS的函數(shù),JS函數(shù)的返回值進入QT
1、QT向JS傳遞數(shù)組
基本類型可以直接傳遞,例如 int bool string double等
qt向js傳遞數(shù)組,需要把數(shù)組轉(zhuǎn)成QJsonArray,再把QJsonArray轉(zhuǎn)成QString, 這樣js就會接收到一個基本類型string,而這個string在js中直接就是一個標準的js數(shù)組。
QT代碼示例:調(diào)用js函數(shù),并給這個js函數(shù)傳遞一個數(shù)組作為參數(shù)
//方法1:構(gòu)造QJsonArray,然后轉(zhuǎn)成QString
QJsonArray ja;
ja << 3 << 4 << 5;
QString jpar = QString(QJsonDocument(ja).toJson());
QString cmd = QString("qtPara(%0)").arg(QString(QJsonDocument(ja).toJson()));
//方法2:直接把數(shù)組寫成string
// QString cmd = QString("qtPara([13,14,15])");
//運行js函數(shù)
webView->page()->runJavaScript(cmd);
上面代碼調(diào)用的javascript函數(shù)為:
function qtPara(numList)
{
alert("js alert: " + numList);//顯示qt傳來的整個數(shù)組
alert("js alert[0]: " + numList[0]);//顯示qt傳來數(shù)組第0個元素
}
2、JS向QT傳遞數(shù)組
JS如果向QT傳遞數(shù)組,那么QT就要把這個值轉(zhuǎn)成 QJsonArray
JS還可以向QT傳遞任意JS對象,那么QT要轉(zhuǎn)成QJsonObject
QT端示例代碼:
QString cmd = QString("jsString()");
webView->page()->runJavaScript(cmd, [](const QVariant &v)
{
//情形1:當js返回數(shù)字時
qDebug() << "qt call js = " << v.toDouble();
//情形2:當js返回string值時
qDebug() << "qt call js = " << v.toString();
//情形3:當js返回 js數(shù)組時
QJsonArray ja = v.toJsonArray();
qDebug() << "j[0] = " << ja.at(0).toDouble();
//情形4:當js返回 js 對象時
QJsonObject jo = v.toJsonObject();
qDebug() << jo;
});
上述代碼所調(diào)用的JS端的函數(shù):
// 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傳遞任意類型數(shù)據(jù)
QT端用QVariant類型來接收,然后qDebug這個值,就能看到這個JS值是如何被封裝為QVariant的,然后我們就能
例如,JS向QT返回一個這樣的值,這是一個JS對象數(shù)組,每個元素都是一個Point對象,且這個Point對象有l(wèi)ng和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))))))
我們發(fā)現(xiàn),
① QT把JS的對象數(shù)組,封裝成了QVariantList, 也即QList<QVariant>,
② 這個list的每個成員又都被QT封裝成了QVariantMap, 也即QMap<QString, QVariant>
③ 每個map中的key都是QString,value都是QVariant,且這個QVariant是double。
經(jīng)過上述分析步驟,我們就可輕易地解析出JS向QT傳來的任意數(shù)據(jù)了。
到此這篇關(guān)于QT與javascript交互數(shù)據(jù)的實現(xiàn)的文章就介紹到這了,更多相關(guān)QT與javascript交互 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決layui數(shù)據(jù)表格table的橫向滾動條顯示問題
今天小編就為大家分享一篇解決layui數(shù)據(jù)表格table的橫向滾動條顯示問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
JS實現(xiàn)上傳圖片的三種方法并實現(xiàn)預(yù)覽圖片功能
在用戶注冊頁面,需要用戶在本地選擇一張圖片作為頭像,并同時預(yù)覽,實現(xiàn)思路有兩種,具體實現(xiàn)方法和實例代碼大家參考下本文2017-07-07
關(guān)于webpack2和模塊打包的新手指南(小結(jié))
本篇文章主要介紹了關(guān)于webpack2和模塊打包的新手指南(小結(jié)),具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-08-08
在webstorm開發(fā)微信小程序之使用阿里自定義字體圖標的方法
這篇文章主要介紹了在webstorm開發(fā)微信小程序之使用阿里自定義字體圖標 的相關(guān)資料,需要的朋友可以參考下2018-11-11
js數(shù)組的基本用法及數(shù)組根據(jù)下標(數(shù)值或字符)移除元素
js數(shù)組的用法包括創(chuàng)建、取值賦值、添加以及根據(jù)下標(數(shù)值或字符)移除元素等等,在本文將為大家詳細介紹下,感興趣的朋友可以參考下2013-10-10
javascript實現(xiàn)簡單飛機大戰(zhàn)小游戲
這篇文章主要為大家詳細介紹了javascript實現(xiàn)簡單飛機大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05
js?Cannot?set?properties?of?null(setting?‘onclick‘)問題分
今天增加功能的時候,提示Uncaught?TypeError:?Cannot?set?properties?of?null?(setting?onclick)問題分享下,需要的朋友可以參考下2023-06-06

