前言
之前我用过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的知识又增加了。(*^▽^*)