[英]QSettings how to save QMap<QString,int> into configuration file
在閱讀Save QList<int>
到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
您獲得的錯誤消息是由預處理器不知道模板的事實引起的。 因此它解析宏調用是否有兩個參數 - 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();
就像Mat所說,錯誤是由預處理器不理解模板引起的。 但是,您可以通過簡單的typedef輕松解決此問題。
typedef QMap<QString,int> QIntMap
Q_DECLARE_METATYPE(QIntMap)
QSetting
接受QVariant
類型傳遞給setValue
方法,這意味着你可以將QMap<QString, QVarint>
map直接存儲到設置中
// 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();
}
我理解接受的答案,但我認為最初的問題是如何存儲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()”將一堆不同的數據結構分組到一個文件中。 非常整潔和可讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.