在阅读了Save QList to QSettings之后,我正在尝试用QMap<QString,int>做同样的事情。我希望配置文件看起来像这样:
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发布于 2011-07-31 17:26:15
您得到的错误消息是由预处理器不知道模板的事实引起的。因此,如果宏调用了两个参数- 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();要读取设置,请在childKeys()函数的帮助下使用相同的方法。
settings.beginGroup("Whatever");
QStringList keys = settings.childKeys();
foreach (QString key, keys) {
map[key] = settings.value(key).toInt();
}
settings.endGroup();发布于 2013-04-24 17:55:01
就像Mat说的,错误是由预处理器不理解模板引起的。但是,您可以通过一个简单的typedef轻松地解决这个问题。
typedef QMap<QString,int> QIntMap
Q_DECLARE_METATYPE(QIntMap)发布于 2017-03-30 21:18:25
QSetting接受将QVariant类型传入setValue方法,因此这意味着您可以直接存储QMap<QString, QVarint>映射到设置
// 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();
}https://stackoverflow.com/questions/6888375
复制相似问题