Qt - Как сохранить файл конфигурации на нескольких платформах - PullRequest
3 голосов
/ 06 декабря 2010

Я пишу приложение Qt, которому нужно сохранить некоторые настройки в каталоге конфигурации пользователя.

Я получил следующий код, чтобы получить эту папку:

#ifdef Q_WS_WIN
    path = QDir::homePath() + "/Application Data/Timely";
#else
    path = QDir::homePath() + "/.config/Timely";
#endif

Это не работает в Windows 7, поскольку Windows 7 использует данные приложения / роуминг / [YourApp]. Как я могу получить папку конфигурации пользователя кросс-платформенным способом? Я что-то упускаю из виду? (это должно быть легкой задачей)

Ответы [ 4 ]

11 голосов
/ 06 декабря 2010

Зависит от настроек, которые вы хотите записать, но я бы предложил использовать QSettings .

6 голосов
/ 06 декабря 2010

Да, это должно быть легкой задачей - но вы не должны жестко кодировать пути.Вы должны использовать нативные API-интерфейсы в win / mac и переменную окружения в большинстве новых Unix-подобных.Конечно, Qt помогает вам в этом кроссплатформенно.

Следуйте советам Tibur и используйте QSettings, если это данные конфигурации вашего приложения Qt.Вы также можете получить каталог конфигурации, используя соответствующий QT API.

QT4: QDesktopServices::storageLocation(QDesktopServices::DataLocation)
QT5: QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)

1 голос
/ 13 ноября 2013

Я использую QSettings для простых значений, которые имеет смысл поместить в реестр Windows или файл INI, и SQLite для более сложных настроек.В Qt5 поместите базу данных SQLite в QStandardPaths :: writableLocation (QStandardPaths :: ConfigLocation) .В Qt4 поместите базу данных SQLite в QDesktopServices , как предложил gnud ( устарело в Qt5 ).

0 голосов
/ 09 сентября 2016

В дополнение к предоставленным ответам, предлагающим использовать QSettings, я буду бесстыдно скопировать собственный пример Qt из документации (хотя я немного отредактировал его).

Вот функции для чтения и записи настроек из файла/ Registry / что угодно:

void MainWindow::readSettings()
{
    QSettings settings("Moose Soft", "Clipper");

    settings.beginGroup("MainWindow");
    resize(settings.value("size", QSize(400, 400)).toSize()); // note the 400x400 defaults if there is no saved settings yet
    move(settings.value("pos", QPoint(200, 200)).toPoint()); // here default pos is at 200,200
    settings.endGroup();
}

void MainWindow::writeSettings()
{
    QSettings settings("Moose Soft", "Clipper");

    settings.beginGroup("MainWindow");
    settings.setValue("size", size());
    settings.setValue("pos", pos());
    settings.endGroup();
}

Функцию readSettings() можно вызвать из конструктора MainWindow:

MainWindow::MainWindow()
{
    ...
    readSettings();
}

, а writeSettings() из обработчика события закрытия:

void MainWindow::closeEvent(QCloseEvent *event)
{
        writeSettings();
        event->accept();
}

И последнее, но не менее важное: обратите внимание, что формат настроек может быть другим.Например, если вы хотите, чтобы настройки сохранялись в реестре в Windows, вы должны передать конструктору QSettings::NativeFormat, но если вы хотите ввести текстовую конфигурацию в %appdata%, вместо этого введите QSettings::IniFormat.В приведенном выше примере формат не передается, поэтому он является стандартным по умолчанию.

Мое личное предпочтение - установить IniFormat для Windows (поскольку данные реестра нелегко переносить) и NativeFormat для Linux и macOS, вот так:

QSettings *settings;

if ( (os == "Linux") | (os == "macOS") ) {
    settings = new QSettings(QSettings::NativeFormat, QSettings::UserScope, "Moose Soft", "Clipper");
} else {
    settings = new QSettings(QSettings::IniFormat, QSettings::UserScope, "Moose Soft", "Clipper");
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...