对于一个程序来说,数据是至关重要的,qml中是用ListModel来读取写入数据的,但如何让这次的数据修改后保存并在下次读取呢,我用json文件的存取写了个小示例:
首先,在xxx.h中声明save和load函数(上篇写过怎么注册c++类)
Q_INVOKABLE void savedata(const QVariantList &data);
//传入的是QVariantList类型的万能数组
//&引用传参,提高效率,加const限制修改
Q_INVOKABLE QVariantList loaddata();
一、save函数
先在xxx.cpp中实现,将QVariantList转换为QByteArray写入json文件
#include <QVariantList>
#include <QJsonArray>
#include <QJsonObject>
#include <QFile>
#include <QJsonDocument>
void testc::savedata(const QVariantList &data)
{
QJsonArray js; //用来初始化json文档
for(const QVariant& piece:data){ //用万能变量遍历万能数组
js.append(QJsonObject::fromVariantMap(piece.toMap()));
} //.topMap()转换为QVariantMap类型
//QJsonObject::fromVariantMap()转换为QJsonObject类型
//将QJsonObject添加入数组
QJsonDocument dc(js); //用json数组初始化json文档
QFile file("data.json"); //创建json文件
if(file.open(QIODevice::WriteOnly)){ //只写方式打开json文件并检查是否成功
file.write(dc.toJson()); //将json字符串写入文件
//将json文档转换为QByteArray类型的json字符串
file.close();
qDebug()<<"保存成功";
}
}
然后在qml中将ListModel的数据封装成QVariantList
ListModel{
id:litmodel
ListModel{
id:litmodel
ListElement{
num:""
city:""
people:""
}
}
}
Testc{
id:test
}
Button{
onClicked: {
let data=[] //创建一个万能空数组
for(let i=0;i<litmodel.count;i++){ //遍历ListElement
let getdata=litmodel.get(i) //获取索引为i的ListElement数据
data.push({
num:getdata.num, //num为json文件中存储的键,getdata.num为值
city:getdata.city,
people:getdata.people})
}
test.savedata(data) //save函数存储完成
}
}
二、load函数
其实就是save函数的相反,将json文件中的QByteArray数据转换为QVariantList
QVariantList testc::loaddata()
{
QVariantList datalist;
QFile file("data.json");
if(file.open(QIODevice::ReadOnly)){ //以只读方式打开并检查是否成功
QByteArray data=file.readAll(); //读取json文件的所有内容
file.close();
QJsonDocument dc=QJsonDocument::fromJson(data); //将QByteArray转换为QJsonDocument
QJsonArray arr=dc.array(); //将QJsonDocument转换为QJsonArray
for(const QJsonValue &val:arr){ //用QJsonValue遍历数组
//QJsonObject存入QJsonArray后被包装为QJsonValue
datalist.append(val.toObject().toVariantMap());
//.toObject()将QJsonValue转换为QJsonObject
//.toVariantMap()将QJsonObject转换为QVariantMap
//将QVariantMap存入QVariantList,进入QVariantList会被封装成QVariant
}
qDebug()<<"读取成功";
}
return datalist;
}
然后在qml中用QVariant初始化ListModel,可以用Component.onCompleted让程序在打开时自动加载数据
Component.onCompleted: {
litmodel.clear() //清除model原有数据
let data=test.loaddata()
for(let i=0;i<data.length;i++){ //遍历QVariantList
litmodel.append(data[i]) //挨个将QVariant添加入model
}
}
这样就完成对ListModel的存储和读取功能了。
json文件存储可读性高,也不需要额外依赖,但数据类型转换繁琐,不适用于大数据量,对复杂操作也更乏力,所以视情况还是选用数据库更好,下一篇我也会码一下数据库存取
3704

被折叠的 条评论
为什么被折叠?



