【问题标题】:How to save QList<QMap> into QSettings file如何将 QList<QMap> 保存到 QSettings 文件中
【发布时间】:2019-01-09 12:46:45
【问题描述】:

我有大量数据存储在QList&lt;QMap&lt;QString,float&gt;&gt; 类型的变量中,我需要保存该变量以便轻松检索它。 我想用QSettings 将它保存到一个文件中,但没有运气。我该怎么做?

【问题讨论】:

    标签: c++ serialization qlist qmap qsettings


    【解决方案1】:

    为了保存某些类型的数据QSettings 使用QDataStream,因此除了使用qRegisterMetaTypeStreamOperators 注册它之外,您还必须为QMap &lt;QString, float&gt; 实现它。

    #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
    

    【讨论】:

      【解决方案2】:
      QSettings settings("name" "key");
      foreach(QMap<QString, float> element, list)
          settings.value(element.key,element.value);
      

      这将是我的方法。什么不工作?

      【讨论】:

      • 这个对我不起作用,因为列表中每个地图对象的键都是相同的。
      • 所以我会说这是一个设计问题而不是 QSettings 问题?为什么要使用始终具有相同键的地图?
      • 这当然不是设计问题,让我们假设这些地图是一些信号,它是在一定时间内的值。值正在从一个地图更改为另一个。
      • 那么可能在 QStrings 的时间戳?当我认为正确时,所有 QMap 都是同时对不同信号的一种测量?或者考虑使用继承自 QMap 的自己的类,在其中添加时间戳成员,可以在保存时使用
      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-31
      相关资源
      最近更新 更多