У меня есть большой объем данных, хранящихся в переменной типа QList<QMap<QString,float>>
, и мне нужно сохранить переменную, чтобы легко получить ее. Я хочу сохранить его в файл с QSettings
, но безуспешно. Как я могу это сделать?
Как сохранить QList‹QMap› в файл QSettings
Ответы (2)
Чтобы сохранить некоторые типы данных, QSettings
использует QDataStream
, поэтому вы должны реализовать их для QMap <QString, float>
в дополнение к регистрации с помощью qRegisterMetaTypeStreamOperators
.
#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
person
eyllanesc
schedule
09.01.2019
QSettings settings("name" "key");
foreach(QMap<QString, float> element, list)
settings.value(element.key,element.value);
Это будет мой подход. Что не работает?
person
RoQuOTriX
schedule
09.01.2019
этот не будет работать со мной, так как ключи каждого объекта карты внутри списка одинаковы.
- person Alaa Agwa; 09.01.2019
Так что я бы сказал, что это проблема дизайна, а не проблема QSettings? Зачем использовать карту с всегда одним и тем же ключом?
- person RoQuOTriX; 09.01.2019
это, конечно, не проблема дизайна, давайте предположим, что эти карты являются некоторыми сигналами и их значениями в течение определенного периода времени. значения меняются от карты к другой.
- person Alaa Agwa; 09.01.2019
Тогда, может быть, по отметке времени для QString? Когда я считаю это правильным, все QMaps являются одним измерением разных сигналов одновременно? Или рассмотрите возможность использования собственного класса, наследуемого от QMap, где вы добавляете элемент временной метки, который вы можете использовать при сохранении
- person RoQuOTriX; 09.01.2019