Qt6 QML中如何用json文件存储读取ListModel数据

对于一个程序来说,数据是至关重要的,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文件存储可读性高,也不需要额外依赖,但数据类型转换繁琐,不适用于大数据量,对复杂操作也更乏力,所以视情况还是选用数据库更好,下一篇我也会码一下数据库存取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值