QSettings: sync Когда он синхронизируется? - PullRequest
2 голосов
/ 05 апреля 2019

Из справочной функции Qt:

void QSettings :: sync () Записывает все несохраненные изменения в постоянное хранилище и перезагружает все параметры, которые были изменены тем временем другим приложением. Эта функция вызывается автоматически из деструктора QSettings и через цикл обработки событий через регулярные промежутки времени, поэтому обычно вам не нужно вызывать ее самостоятельно.

Что именно здесь означает «тем временем»? Всегда ли это сбрасывает мои настройки до того момента, когда я запустил программу, а это значит, что я никогда не смогу изменить свою конфигурацию во время ее выполнения при использовании sync ()?

1 Ответ

4 голосов
/ 05 апреля 2019

Можно предположить, что QSettings реализован как глобальный std::map<QString, QVariant>, который действует как кэш настроек. В документации сказано:

QSettings хранит настройки. Каждый параметр состоит из QString, которая задает имя параметра (ключ), и QVariant, в котором хранятся данные, связанные с ключом.

В целях эффективности документация гласит:

Для эффективности изменения не могут быть немедленно сохранены в постоянном хранилище. (Вы всегда можете вызвать sync () для фиксации ваших изменений.)

Каждый раз, когда вы изменяете параметр, обновляется значение кэша, но не постоянный файл. Поведение QSettings зависит от платформы.

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

Вы можете получить путь, используя класс QStandardPaths и тег QStandardPaths::ConfigLocation:

qDebug() << QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);

Чтобы отслеживать изменения в файле (как часто выполняются функции синхронизации), вы можете использовать этот скрипт Python .

Отвечая на ваш вопрос:? Всегда ли это сбрасывает мои настройки до того момента, когда я запустил программу, а это значит, что я никогда не смогу изменить свою конфигурацию во время ее выполнения при использовании sync ()?

QSettings::sync объединяет изменения из системного файла и изменений в вашем кэше для сохранения их в файле. Если у вас есть несколько приложений, изменяющих один и тот же файл, они могут перезаписывать друг друга.

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

Это не

...