ini文件(QSettings)保存QNetworkCookie(或自定义结构体)——Qt

前言

之前我用过QSettings写过ini文件作为配置文件,也用过QVariant变量(无论是官方支持的还是自定义的),但是在ini文件中,将QVariant的值作为Value进行保存,是没遇到过,也没做过。

这次公司项目中涉及到将Cookie的值保存到本地,看到了大佬写的代码,然后才发现有这一写法 ,在此记录一下。

说明和代码

这里的实例也是我项目中的:将QNetworkCookie保存在ini文件中

关于文件的读写肯定用到了数据流QDataStream,也就是用输入、输出操作符将文件读写。由于QNetworkCookie没有输入、输出操作,所以这部分需要我们自己写。以下是我写的,当然,你也可以加一些别的信息进去,只要输入输出的对应起来就可以。直白的说,就是将数据打包、解析。

若不写这些操作,直接保存到ini文件里,将会报错QVariant::save: unable to save type 'QNetworkCookie' (type id: 1025).

QDataStream &operator<<(QDataStream &stream, const QNetworkCookie &cookie)
{
    stream << cookie.toRawForm();
    return stream;
}

QDataStream &operator>>(QDataStream &stream, QNetworkCookie &cookie)
{
    QByteArray value;
    stream >> value;
    QList<QNetworkCookie> newCookies = QNetworkCookie::parseCookies(value);
    if (newCookies.count() == 0 && value.length() != 0) {
        qWarning() << "CookieJar: Unable to parse saved cookie:" << value;
    }
    cookie=newCookies.at(0);

    return stream;
}

并不是这样就万事大吉了,还需要将这个输入、输出操作符进行注册,进行告知。

qRegisterMetaTypeStreamOperators<QNetworkCookie>("QNetworkCookie");

下面就是将QNetworkCookie和QVariant互转,具体参考我之前的博客QVariant的用法_xiaopei_yan的博客-CSDN博客_qvariant

 读取

            QList<QNetworkCookie> cookieList;
            cookieList.clear();
            QString filePath=fileInfo.absoluteFilePath();
            QSettings cookieSettings(filePath, QSettings::IniFormat);
            int size=cookieSettings.beginReadArray("Cookies");
            for(int i=0;i<size;i++)
            {
                cookieSettings.setArrayIndex(i);
                QNetworkCookie cookie=qvariant_cast<QNetworkCookie>(cookieSettings.value("cookie"));
                cookieList.append(cookie);
            }

 写入

        QString path=domainCookieDir + QLatin1String("/cookies.ini");
        QSettings cookieSettings(path, QSettings::IniFormat);
        int size = cookieSettings.beginReadArray("Cookies");
        cookieSettings.endArray();

        cookieSettings.beginWriteArray("Cookies");
        cookieSettings.setArrayIndex(size);

        cookieSettings.setValue("cookie",QVariant::fromValue<QNetworkCookie>(cookie));
        cookieSettings.endArray();

结束语

关于QSettings和QVariant的知识又增加了。(*^▽^*)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值