【问题标题】:QSettings how to save QMap<QString,int> into configuration fileQSettings 如何将 QMap<QString,int> 保存到配置文件中
【发布时间】:2011-07-31 08:32:30
【问题描述】:

阅读Save QList&lt;int&gt; to QSettings 后,我想对QMap&lt;QString,int&gt; 做同样的事情。我希望配置文件看起来像这样:

1111=1  
2222=3  
4444=0  

但是我得到一个编译错误:

Q_DECLARE_METATYPE(QMap<QString,int>)

Warning C4002: too many actual parameters for macro 'Q_DECLARE_METATYPE'
ConfigSettings.h(5) : error C2976: 'QMap' : too few template arguments

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    您收到的错误消息是由于预处理器不了解模板这一事实引起的。所以它解析宏调用是否有两个参数 - QMap&lt;QStringint&gt;,这是没有意义的。

    要根据需要保存数据,最好自己将其序列化到您的QSettings。写这样的东西:

    settings.beginGroup("Whatever");
    QMap<QString, int>::const_iterator i = map.constBegin();
    while (i != map.constEnd()) {
         settings.setValue(i.key(), i.value());
         ++i;
     }
    settings.endGroup();
    

    要读取设置,请在 childKeys() 函数的帮助下使用相同的方法。

    settings.beginGroup("Whatever");
    QStringList keys = settings.childKeys();
    foreach (QString key, keys) {
         map[key] = settings.value(key).toInt();
    }
    settings.endGroup();
    

    【讨论】:

      【解决方案2】:

      就像Mat说的,这个错误是由于预处理器不理解模板造成的。但是,您可以通过简单的 typedef 轻松解决此问题。

      typedef QMap<QString,int> QIntMap
      Q_DECLARE_METATYPE(QIntMap)
      

      【讨论】:

      • 对于更一般的情况,这似乎是一个更好的答案,尽管我理解为什么选择的答案是针对 QSettings 特定情况选择的。
      【解决方案3】:

      QSetting 接受QVariant 类型传入setValue 方法,也就是说你可以将QMap&lt;QString, QVarint&gt; 映射直接存储到设置中

      // Store
      QMap<QString, QVariant> storeMap;
      QMapIterator it(myMap);
      // iterate through the map to save the values in your chosen format
      while(it.hasNext())
      {
          storeMap[it.key()] = QVariant(it.value());
          it.next();
      }
      settings.setValue("myKey", storeMap);
      
      ..
      // Read
      QMap<QString, QVariant> readMap = settings.value("myKey").toMap();
      QMapIterator it(readMap);
      while(it.hasNext())
      {
          myMap[it.key()] = it.value().toInt();
          it.next();
      }
      

      【讨论】:

        【解决方案4】:

        我理解接受的答案,但我认为最初的问题是如何存储 QMap。它演变成如何使编译器正常运行。

        QSettings mySettings...
        QMapIterator it(myMap);
        // iterate through the map to save the values in your chosen format
        while(it.hasNext())
        {
            it.next();
            mySettings.setValue(it.key(), it.value());
        }
        

        但是,如果您希望将其与一堆其他设置或数据结构一起存储,您可以考虑使用“beginGroup()”和“endGroup()”将一堆不同的数据结构组合到一个文件中。非常整洁易读。

        【讨论】:

        • 虽然我们感谢您的回答,但如果它在其他答案之上提供额外的价值会更好。在这种情况下,您的答案不会提供额外的价值,因为另一个用户已经发布了该解决方案。如果之前的答案对您有帮助,您应该投票而不是重复相同的信息。
        猜你喜欢
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多