C++ Qt-如何在多个平台上保存配置文件
我正在编写一个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]。如何以跨平台的方式获取用户的
#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");
};