Как сохранить QList‹QMap› в файл QSettings

У меня есть большой объем данных, хранящихся в переменной типа QList<QMap<QString,float>>, и мне нужно сохранить переменную, чтобы легко получить ее. Я хочу сохранить его в файл с QSettings, но безуспешно. Как я могу это сделать?


person Alaa Agwa    schedule 09.01.2019    source источник


Ответы (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
comment
этот не будет работать со мной, так как ключи каждого объекта карты внутри списка одинаковы. - person Alaa Agwa; 09.01.2019
comment
Так что я бы сказал, что это проблема дизайна, а не проблема QSettings? Зачем использовать карту с всегда одним и тем же ключом? - person RoQuOTriX; 09.01.2019
comment
это, конечно, не проблема дизайна, давайте предположим, что эти карты являются некоторыми сигналами и их значениями в течение определенного периода времени. значения меняются от карты к другой. - person Alaa Agwa; 09.01.2019
comment
Тогда, может быть, по отметке времени для QString? Когда я считаю это правильным, все QMaps являются одним измерением разных сигналов одновременно? Или рассмотрите возможность использования собственного класса, наследуемого от QMap, где вы добавляете элемент временной метки, который вы можете использовать при сохранении - person RoQuOTriX; 09.01.2019