QSettings: переместить / изменить область / местоположение существующего объекта QSettings - PullRequest
0 голосов
/ 14 января 2012

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

Что я знаю:

  • QSettings :: setPath () используется перед построением и не влияет на существующие объекты.
  • Оператор копирования является частным. Я мог бы создать подкласс QSettings, но боюсь потерять настройки во время операции копирования из-за одновременной записи других потоков.

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

1 Ответ

0 голосов
/ 17 января 2012

Можно ли использовать потокобезопасный класс-оболочку singleton?

class Settings {

public:
    static Settings& instance() 
    { 
        static Settings* inst = 0;
        if (!inst)
            inst = new Settings();
        return *inst; 
    }
    QSettings& getSettings { QMutexLocker(&m_mutex); return *m_settings; }
    bool migrateLocation(...) 
    { 
        QMutexLocker(&m_mutex); 
        QSettings* newSettings = new QSettings(...new parameters...);
        //... copy over the stuff
        delete m_settings;
        m_settings = newSettings;
    }
private:
    Settings() { m_settings = new QSettings(...); }

    static QMutex m_mutex;
    QSettings* m_settings;
}
...