我正在编写一个需要将一些设置保存到用户配置目录的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]。如何以跨平台方式获取用户的配置文件夹?我错过了一些明显的东西吗? (这应该是一项简单的任务)
答案 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");
};