Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt-如何在多个平台上保存配置文件_C++_Qt_Cross Platform - Fatal编程技术网

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

C++ Qt-如何在多个平台上保存配置文件,c++,qt,cross-platform,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使用应用程序数据/漫游/[YourApp]。如何以跨平台的方式获取用户的

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

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

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

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

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

是的,这应该是一项简单的任务-但您不应该硬编码路径。您应该在win/mac上使用本机api,在最新的unix-like上使用环境变量。当然,Qt可以帮助您跨平台完成这项工作

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

QT4:

QT5:

我用于简单的值,这些值可以放在Windows注册表或INI文件中,也可以用于更复杂的设置。在Qt5中,将SQLite数据库放入。在Qt4中,按照gnud的建议()将SQLite数据库放入其中。

除了提供的建议使用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();
}
可以从主窗口构造函数调用
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");
};