Q设置如何将QMap <qstring,int>保存到配置文件</qstring,int>中

时间:2011-07-31 08:32:30

标签: c++ qt

在阅读Save QList<int> 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

4 个答案:

答案 0 :(得分:14)

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

要根据需要保存数据,最好自己将其序列化到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();

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

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();
}

答案 3 :(得分:0)

我理解接受的答案,但我认为最初的问题是如何存储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()”将一堆不同的数据结构分组到一个文件中。非常整洁和可读。