Как правильно использовать QSettings

Я хочу использовать QSettings для сохранения рекордов, но это не работает должным образом. Я сохраняю и читаю эти значения в двух разных файлах.

Это мой код, отвечающий за добавление значений в массив:

QSettings settings;
settings.beginWriteArray("results");
int size = settings.beginReadArray("results");
settings.setArrayIndex(size);
settings.setValue("result", "qwerty");

и чтение:

QSettings settings;
QString tmp = "";
int size = settings.beginReadArray("results");
for(int i = 0; i < size; ++i)
{
    settings.setArrayIndex(i);
    tmp += settings.value("result").toString();
}
ui->label->setText(tmp);

person falsetto    schedule 27.04.2013    source источник


Ответы (2)


Я бы сделал это так:

Допустим, у нас есть две функции-члена класса для загрузки и сохранения результатов. Для использования реестра необходимо указать имя приложения и редактор:

QSettings settings("<MyEditorName>","<myAppName>");
saveScores(&settings);
loadScores(&settings);

чтобы использовать файл, вы должны указать путь к файлу и формат:

QSettings settings("<filepath>",QSettings::iniFormat);
saveScores(&settings);
loadScores(&settings);

из вашего кода и документации; функция-член будет следующей. Класс содержит вектор оценок (QVector mScores).

Функция сохранения результатов:

void myClass::saveScores(QSettings* iSettings){
  iSettings->beginGroup("Scores");
  iSettings->beginWriteArray("results");
  for(int i=0; i<mScores.count();i++){
    iSettings->setArrayIndex(i);
    iSettings->setValue("result",mScores[i]);
  }
  iSettings->endArray();
  iSettings->endGroup();
}

Функция для загрузки результатов

void myClass::loadScores(QSettings* iSettings){
  iSettings->beginGroup("Scores");
  int size = iSettings->beginReadArray("results");
  mScores.resize(size);
  for(int i=0;i<size;i++){
    iSettings->setArrayIndex(i);
    mScores[i] = iSettings->value("results").toInt();
  }
  iSettings->endArray();
  iSettings->endGroup();
}

Я использую группы, чтобы обеспечить лучшую видимость в файле сохранения, но вы можете удалить их.

person user2019716    schedule 27.04.2013
comment
Хороший ответ, но вам не хватает iSettings->endArray() - person Tomáš Zato - Reinstate Monica; 25.01.2016

Проблема вызывает метод beginReadArray() после beginWriteArray(). Сделай это:

QSettings settings;
int size = settings.beginReadArray("results");
settings.endArray();
settings.beginWriteArray("results");
settings.setArrayIndex(size);
settings.setValue("result", "qwerty");
settings.endArray();

Обратите внимание, что вам нужно вызвать endArray(), когда закончите.

person parkydr    schedule 27.04.2013