C++ 与JS 通信使用的是 QWebChannel 与 qwebchannel.js。js 向后端传数组还是很方便的。就是在解析的时候要注意一下。js 传向传数组的时候,后端解析为QJSonArray。而在解析QJSonArray的时候,要小心。我遇到的问题就是传过来int 数组,用QJsonArray.at().toInt()的时候无法解析,QJsonArray.at() 获得是QJsonValue,在转QVariant,再转int。
比如前端传入 var cmd=[0x1,0x2,0x3]; 后端槽会把他封装成QJsonArray jsonarray。
QJsonValue jv = jsonarray.at[0];
QVariant var = jv.toVariant();
var.toInt();
现在关键就是前端js 如何将QJsonArray 进行转换。我是个用Qt的容器类是无法向前端传数组的,要不就将他们转成JSON。既然前端能封装QJsonArray,后端应该也能传。我们用qDebug输出QJsonArray内容的时候,格式如下:“[[1,2,3]]”。传到前端的时候,用console.log输出格式“1,2,3”。而#length的值是1,也就是数组长度为一,这就和qDebug()的输出符合上了(js的数组是[]表示)。这里也就说明了为什么不能直接用QJsonArray的toInt去转换数据。console.log输出的其实还是一个数组值,但与我们定义数组的时候有区别,js定义数组可以是var cmd=[2,3,4]。这里就要去解析这个数组。其实很简单用eval就可以搞定,但得加点数组说明,假设传过来的值是c_array,var array=eval("["+c_array+"]"); 这个时候用console.log输出就变成了“[1,2,3]”。转换完成。。