Понадобилось в INI файл сохранять массивы строк. У QSettings есть поддержка - beginWriteArray/beginReadArray/setArrayIndex/endArray. Использование простое. Как написано в доках Qt, так и сделал:
Запись:
void MainWindow::saveList( QStringList list )
{
QSettings settings(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)+
SETTINGSFORMAT, QSettings::IniFormat);
int size;
settings.beginWriteArray(LISTNAME, size = list.size());
for( int i = 0; i < size; i++ )
{
settings.setArrayIndex( i );
settings.setValue( ITEMNAME, list.at( i ) );
}
settings.endArray();
settings.sync()
}
Чтение:
QStringList MainWindow::restoreList()
{
QSettings settings(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)+
SETTINGSFORMAT, QSettings::IniFormat);
QStringList list;
int size = settings.beginReadArray(LISTNAME);
for( int i = 0; i < size; i++ )
{
settings.setArrayIndex( i );
list << settings.value(ITEMNAME).toString();
}
settings.endArray();
return list;
}
Запускаю, сохраняю список из 10 строк. Смотрю в INI файл - сохранился, 10 строк, в конце перменная size=10. Хорошо. Запускаю снова, читаю список, отображаю - есть 10 строк. Хорошо. Удаляю из списка 5 строк вперемежку, не подряд. Сохраняю снова, читаю... БУМ! В INI файле по-прежнему 10 строк. Первые 5 - те, которые я оставил, и соответственно сохранил. Следом за ними хвост из 5 строк от предыдущих 10, которые сохранял первый раз. И потом переменная size=5. Запускаю снова, читаю - получаю конечно же 5 строк. Отображаю - да, всё верно, первые 5. То есть, у меня QStringList.size() == 5. Сохраняю снова этот QStringList, смотрю INI файл - !@!@#$#... там 10 строк, первые 5 правильные потом хвост из лишних 5.
Что это значит? - Что если вы сохраните 1 раз 4235432 элементов массива в INI файле, а потом будете всё время сохранять и использовать только первые 2 элемента, то QSettings будет всё равно постоянно таскать туда-сюда и хранить на носителе ненужные 4235430 записей...
Руки отрывать надо за такое проектирование.
Баг репорт создал.