Qt - 如何在多个平台上保存配置文件

时间:2010-12-06 18:28:38

标签: c++ qt cross-platform

我正在编写一个需要将一些设置保存到用户配置目录的Qt应用程序。

我想出了以下代码来获取此文件夹:

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

在Windows 7上失败,因为Windows 7使用App Data / Roaming / [YourApp]。如何以跨平台方式获取用户的配置文件夹?我错过了一些明显的东西吗? (这应该是一项简单的任务)

4 个答案:

答案 0 :(得分:11)

取决于您要录制的设置,但我建议您使用QSettings

答案 1 :(得分:6)

是的,这应该是一项简单的任务 - 但你应该硬编码路径。您应该在win / mac上使用本机API,在大多数较新的unix上使用环境变量。当然,Qt可以帮助您实现跨平台。

按照Tibur的建议,如果它是Qt应用程序的配置数据,请使用QSettings。您还可以使用适当的QT api获取config目录。

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

答案 2 :(得分:1)

我使用QSettings表示放入Windows注册表或INI文件的简单值,SQLite表示更复杂的设置。在Qt5中,将SQLite数据库放在QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)中。在Qt4中,将SQLite数据库放在QDesktopServices中作为gnud建议(deprecated in Qt5)。

答案 3 :(得分:0)

除了提供建议使用QSettings的答案之外,我将无耻地复制Qt自己的文档示例(尽管我稍微编辑过它)。

以下是从文件/注册表/其他内容中读取和写入设置的功能:

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();
}

可以从MainWindow构造函数调用readSettings()函数:

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

来自关闭事件处理程序的writeSettings()

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

最后但并非最不重要的是,请注意,设置格式可能会有所不同。例如,如果您希望将设置保存在Windows的注册表中,则应将QSettings::NativeFormat传递给构造函数,但如果您想要%appdata%中的文本配置,请传递QSettings::IniFormat代替。在上面的示例中,未传递格式,因此默认情况下它是原生的。

我个人倾向于为Windows设置IniFormat(因为注册表数据不易转移)和Linux和macOS的NativeFormat,如下所示:

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");
};