QSettings如何将QMap <QString,int>保存到配置文件中

use*_*898 5 c++ qt

阅读Save QList<int>to后QSettings,我也想做同样的事QMap<QString,int>.我希望配置文件看起来像这样:

1111=1  
2222=3  
4444=0  
Run Code Online (Sandbox Code Playgroud)

但是我收到了编译错误:

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
Run Code Online (Sandbox Code Playgroud)

Mat*_*Mat 14

您获得的错误消息是由预处理器不知道模板的事实引起的.因此它解析宏调用是否有两个参数 - QMap<QString并且int>,这没有任何意义.

要根据需要保存数据,最好自己将其序列化为自己的数据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();
Run Code Online (Sandbox Code Playgroud)

要阅读设置,请在childKeys()功能的帮助下使用相同的方法.

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


Adi*_*tya 5

就像Mat所说,错误是由预处理器不理解模板引起的.但是,您可以通过简单的typedef轻松解决此问题.

typedef QMap<QString,int> QIntMap
Q_DECLARE_METATYPE(QIntMap)
Run Code Online (Sandbox Code Playgroud)