在QML与C++的交互过程中,除了常用的不同属性转换,本文主要讲解QJsonArray、QJsonObject、QByteArray类型在QML中的使用,首先在cpp定义一个类注册到QML中,QML通过调用对应函数接口获取数据并显示
预定义JSON格式的前缀
#define _id "id"
#define _name "name"
#define _major "major"
#define _age "age"
注册类:qmlRegisterType<CppQJson>("CppQJson",1,0,"CppQJson");
qml中使用:import CppQJson 1.0
CppQJson{
id:m_CppQJson
}
QJsonArray
cpp中:
QJsonArray CppQJson::getJsonArrayData()
{
QJsonObject object; //构造两个QJsonObject并插值
object.insert(_id, "1234");
object.insert(_name,"wang");
object.insert(_age,20);
object.insert(_major,"C++");
QJsonObject object2;
object2.insert(_id,"2321");
object2.insert(_name,"he");
object2.insert(_age,15);
object2.insert(_major,"Python");
QJsonArray array; // 构造QJsonArray
array.insert(0,"234");//插入字符串QString
array.insert(1,object);//插入QJsonObject
array.insert(2,object2);
return array;
}
qml中:
Button{
text:"get QJsonArray Data"
onClicked: {
var jsonArray=m_CppQJson.getJsonArrayData()
console.log("cpp QJsonArray is",jsonArray)
console.log("title: ",jsonArray[0].toString())
console.log("jsonobject 1:",jsonArray[1]["id"])
}
}
QJsonObject
cpp中:
QJsonObject CppQJson::getJsonObjectData()
{
QJsonObject object; //构造两个QJsonObject并插值
object.insert(_id, "1234");
object.insert(_name,"wang");
object.insert(_age,20);
object.insert(_major,"C++");
QJsonObject object2;
object2.insert(_id,"2321");
object2.insert(_name,"he");
object2.insert(_age,15);
object2.insert(_major,"Python");
QJsonArray array;
array.insert(0,"123");
array.insert(1,234);
array.insert(2,true);
array.insert(3,object2);
object.insert("array",array);
return object;
}
qml中:
Button{
text:"get QJsonObject Data"
onClicked: {
var jsonObject=m_CppQJson.getJsonObjectData()
console.log("cpp QJsonObject is",jsonObject)
console.log("object name value:",jsonObject["name"])
console.log("object2 major value:",jsonObject["array"][3]["major"])
}
}
QByteArray
cpp中:
QByteArray CppQJson::getByteArrayData()
{
QJsonObject object; //构造两个QJsonObject并插值
object.insert(_id, "1234");
object.insert(_name,"wang");
object.insert(_age,20);
object.insert(_major,"C++");
QJsonObject object2;
object2.insert(_id,"2321");
object2.insert(_name,"he");
object2.insert(_age,15);
object2.insert(_major,"Python");
QJsonArray array; // 构造QJsonArray
array.insert(0,"234");//插入字符串QString
array.insert(1,object);//插入QJsonObject
array.insert(2,object2);
// QJsonArray转换成QByteArray
QJsonDocument document=QJsonDocument(array);
QByteArray byte_array = document.toJson();
return byte_array;
}
qml中:
Button{
text:"get QByteArray Data"
onClicked: {
var byteArray=m_CppQJson.getByteArrayData()
console.log("cpp QByteArray is",byteArray) //JSON文本
var obj=JSON.parse(byteArray) //JSON文本转js对象
console.log("cpp obj is",obj)
console.log("title: ",obj[0])
console.log("jsonobject 1:",obj[1]["id"])
var jsonString=JSON.stringify(obj) //js对象转JSON文本
console.log("cpp jsonString is ",jsonString)
}
}
总结:1.主要涉及QJsonArray、QJsonObject、QByteArray数据类型在QML中显示,其中QByteArray为JSON文本,因此需要使用JSON全局单例对象的parse()方法转为ECMAScript对象。
2.简单使用了JSON全局单例对象的parse()和stringify()方法
关于QJSonArray和QJsonObject直接嵌套使用及与QByteArray的相互转化,详见:https://blog.csdn.net/qq_35173114/article/details/81024143
转载请标明出处:https://blog.csdn.net/qq_35173114/article/details/81031904