Как остановить QSettings, изменяющий порядок пар ключ = значение в файле настроек?

В моей программе у меня есть файл настроек/конфигурации стиля Microsoft INI, который создается, редактируется и сохраняется с использованием удобного класса QSettings, но пользователь может вручную редактировать этот файл с помощью самой программы или любого текстового редактора, например gedit или vim. Порядок, в котором появляются пары ключ=значение, важен. Проблема в том, что всякий раз, когда я пытаюсь сохранить изменения во время выключения, порядок пар ключ = значение меняется на случайный порядок, и кажется невозможным остановить QSettings от его изменения. Для пояснения вот пример файла конфигурации:

[AlarmGroup1]
DateTimeNotInitialized=1
DateTimeStampError=2
ParametersMissingOrInconsistent=3
NotInitialized=4
FlashMemoryFatalError=5
NotIdentified=6

который меняется на:

[AlarmGroup1]
ParametersMissingOrInconsistent=3
DateTimeNotInitialized=1
DateTimeStampError=2
NotInitialized=4
FlashMemoryFatalError=5
NotIdentified=6

Можно ли избежать изменения порядка? Почему Qsettings так себя ведет?


person moki    schedule 25.11.2013    source источник


Ответы (1)


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

Чтобы решить эту проблему, вам нужно:

  • Удалите требование для конкретного заказа из вашей программы
  • Напишите свой собственный эквивалент QSettings
  • Напишите «поставщик пользовательского формата хранения» для передачи в QSettings http://doc.qt.io/qt-5/qsettings.html#registerFormat
person Bigwave    schedule 19.02.2015
comment
Вы пробовали последний вариант? - person moki; 19.02.2015
comment
Боюсь, что нет, я выбрал первый вариант. - person Bigwave; 19.02.2015
comment
Вместо этого я использовал базу данных SQLite. Порядок в таблице остается прежним, и он имеет действительно хорошую производительность и безопасность. Используя третий вариант, который вы упомянули, я думаю, у нас может быть функция чтения и записи, которая выполняется в файле базы данных SQLite. Я больше не работаю над этим, но ваш ответ звучит правдоподобно, поэтому я его приму. - person moki; 19.02.2015