QSettings как сохранить QMapв файл конфигурации - PullRequest
5 голосов
/ 31 июля 2011

После прочтения Сохранить 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

Ответы [ 4 ]

14 голосов
/ 31 июля 2011

Сообщение об ошибке, которое вы получаете, вызвано тем, что препроцессор не знает о шаблонах.Таким образом, этот макрос вызывает синтаксический анализ, если он имеет два аргумента - 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();
5 голосов
/ 24 апреля 2013

Как и Мат сказал, ошибка вызвана тем, что препроцессор не понимает шаблоны. Однако вы можете легко это исправить с помощью простого typedef.

typedef QMap<QString,int> QIntMap
Q_DECLARE_METATYPE(QIntMap)
2 голосов
/ 30 марта 2017

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();
}
0 голосов
/ 27 марта 2017

Я понимаю принятый ответ, но я думаю, что оригинальный вопрос заключался в том, как хранить 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 () для группировки разных структур данных в один файл. Очень аккуратный и читабельный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...