如何将 QList<QMap> 保存到 QSettings 文件中
How to save QList<QMap> into QSettings file
我在 QList<QMap<QString,float>>
类型的变量中存储了大量数据,我需要保存该变量以便轻松检索它。
我想用 QSettings
将它保存到一个文件中,但没有成功。我该怎么做?
QSettings settings("name" "key");
foreach(QMap<QString, float> element, list)
settings.value(element.key,element.value);
这就是我的方法。什么不起作用?
为了保存某些类型的数据 QSettings
使用 QDataStream
因此除了使用 qRegisterMetaTypeStreamOperators
.[= 注册它之外,您还必须为 QMap <QString, float>
实现它16=]
#include <QCoreApplication>
#include <QSettings>
#include <QDebug>
#include <QDataStream>
#ifndef QT_NO_DATASTREAM
QDataStream &operator<<(QDataStream &stream, const QMap<QString,float> &map)
{
QMap<QString, float>::const_iterator i = map.constBegin();
while (i != map.constEnd()) {
stream << i.key() << i.value();
++i;
}
return stream;
}
QDataStream &operator>>(QDataStream &stream, QMap<QString,float> &map)
{
QString key;
float value;
stream >> key;
stream >> value;
map[key] = value;
return stream;
}
#endif
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qRegisterMetaTypeStreamOperators<QMap<QString,float>>("QMap<QString,float>");
qRegisterMetaTypeStreamOperators<QList<QMap<QString,float>>>("QList<QMap<QString,float>>");
{
QSettings settings;
QList<QMap<QString,float>> l;
for(int i=0; i<3; i++){
QMap<QString, float> map;
map["a"] = 0.1*(i+1);
map["b"] = 0.2*(i+1);
map["c"] = 0.3*(i+1);
l<< map;
}
QVariant v = QVariant::fromValue(l);
settings.setValue("val", v);
}
{
QSettings settings;
QVariant v = settings.value("val");
QList<QMap<QString,float>> l = v.value<QList<QMap<QString,float>>>();
int j=0;
for(const QMap<QString, float> &map: l ){
qDebug()<< "index: " << j;
QMap<QString, float>::const_iterator i = map.constBegin();
while (i != map.constEnd()) {
qDebug() << i.key() << ": " << i.value();
++i;
}
j++;
}
}
return 0;
}
输出:
index: 0
"a" : 0.1
"b" : 0.2
"c" : 0.3
index: 1
"a" : 0.2
"b" : 0.4
"c" : 0.6
index: 2
"a" : 0.3
"b" : 0.6
"c" : 0.9
我在 QList<QMap<QString,float>>
类型的变量中存储了大量数据,我需要保存该变量以便轻松检索它。
我想用 QSettings
将它保存到一个文件中,但没有成功。我该怎么做?
QSettings settings("name" "key");
foreach(QMap<QString, float> element, list)
settings.value(element.key,element.value);
这就是我的方法。什么不起作用?
为了保存某些类型的数据 QSettings
使用 QDataStream
因此除了使用 qRegisterMetaTypeStreamOperators
.[= 注册它之外,您还必须为 QMap <QString, float>
实现它16=]
#include <QCoreApplication>
#include <QSettings>
#include <QDebug>
#include <QDataStream>
#ifndef QT_NO_DATASTREAM
QDataStream &operator<<(QDataStream &stream, const QMap<QString,float> &map)
{
QMap<QString, float>::const_iterator i = map.constBegin();
while (i != map.constEnd()) {
stream << i.key() << i.value();
++i;
}
return stream;
}
QDataStream &operator>>(QDataStream &stream, QMap<QString,float> &map)
{
QString key;
float value;
stream >> key;
stream >> value;
map[key] = value;
return stream;
}
#endif
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qRegisterMetaTypeStreamOperators<QMap<QString,float>>("QMap<QString,float>");
qRegisterMetaTypeStreamOperators<QList<QMap<QString,float>>>("QList<QMap<QString,float>>");
{
QSettings settings;
QList<QMap<QString,float>> l;
for(int i=0; i<3; i++){
QMap<QString, float> map;
map["a"] = 0.1*(i+1);
map["b"] = 0.2*(i+1);
map["c"] = 0.3*(i+1);
l<< map;
}
QVariant v = QVariant::fromValue(l);
settings.setValue("val", v);
}
{
QSettings settings;
QVariant v = settings.value("val");
QList<QMap<QString,float>> l = v.value<QList<QMap<QString,float>>>();
int j=0;
for(const QMap<QString, float> &map: l ){
qDebug()<< "index: " << j;
QMap<QString, float>::const_iterator i = map.constBegin();
while (i != map.constEnd()) {
qDebug() << i.key() << ": " << i.value();
++i;
}
j++;
}
}
return 0;
}
输出:
index: 0
"a" : 0.1
"b" : 0.2
"c" : 0.3
index: 1
"a" : 0.2
"b" : 0.4
"c" : 0.6
index: 2
"a" : 0.3
"b" : 0.6
"c" : 0.9