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交互 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!