Я столкнулся с той же проблемой. Существует функция QSettings::sync()
, но, похоже, она требует целостности файла настроек (INI, реестра и т. Д.), Чем согласование настроек с состоянием приложения. Под этой «согласованностью» я подразумеваю, например, что когда я, как пользователь, изменяю размер шрифта в диалоговом окне настроек, я ожидаю, что все приложение будет перекомпоновано и перекрашено. Этого легко достичь в одном приложении (используя сигнальные слоты, события и т. Д.). Но когда у меня запущено два или более приложений, другие экземпляры не получают информации о том, что параметры размера шрифта были изменены, они не перераспределяются и не перерисовываются, а позже, когда любой виджет отображается с использованием нового размера шрифта, инициализированного из QSettings
, это становится несовместимым с остальной частью приложения, и макет может быть поврежден.
Однако есть решение для этого. Требуется добавить еще один уровень «кэширования» для всех настроек, выше QSettings
. Все настройки будут загружены в некоторый класс данных настроек с помощью QSettings::value(...)
только при запуске приложения, а во время запуска приложения приложение не будет напрямую считывать из QSettings::value()
, а только из кеша. Таким образом, вы будете иметь полностью последовательное поведение. Когда пользователь изменяет некоторые настройки в диалоговом окне настроек, каждый элемент сравнивается с кэшированным значением (т. Е. Проверяет, изменил ли пользователь его) и, если оно не равно, записывается в настройки с использованием QSettings::setValue()
.
// To be created at application startup, just after
// QApplication::setApplication(), setOrganizationName() etc. is called.
// When the application is running, you only obtain cached values
// from the instance of Settings instead of querying QSettings.
class Settings
{
Settings() {
m_x = QSettings().value("x", 0).toInt();
}
int x() const {
return m_x;
}
void setX(int x) {
if (x == m_x)
return;
m_x = x;
QSettings().setValue("x", x);
}
private:
int m_x;
}