如何在Qt中以跨平台的方式获取设置存储路径?
How to get a settings storage path in a cross-platform way in Qt?
我的程序需要 read/write 一个文本(只有几行)文件及其设置到磁盘。在代码中指定路径可能在一个平台上运行良好,例如 windows,但如果在 Linux 上运行它,则该路径不是跨平台的。
我正在寻找与 QSettings
类似的解决方案,该解决方案将设置保存到不同的路径或具有处理此问题的本机方法。程序员不需要处理细节。但文本文件不适合保存为 QSettings
.
中的值
获得这样的路径不需要用户交互。文本文件应在应用程序重新启动后持续存在。不能是临时文件。
Qt 中是否有现成的解决方案,应该使用什么API?
如果要保存一些用户相关数据,可以使用QDir::homePath()
获取用户主目录路径。
有QDir
to handle paths to dirs, QFileInfo
for platform independent file information and QDir
's homePath()
我的建议是使用这些 类 并使用 QDir::home()
或 QDir::homePath()
找到写入的目录,因为用户在他的 homedir 中有写权限并且它存在在每个平台上。
您可以将文件存储在应用程序目录中。看看QCoreApplication::applicationDirPath()
.
来自 Qt 文档:
Returns the directory that contains the application executable.
应用程序特定设置的存储位置因平台而异。 Qt 5 通过 QStandardPaths
.
提供了一个明智的解决方案
通常,您会将每个用户的设置存储在 QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)
中。如果您希望设置不保留在 Windows 上用户的漫游配置文件中,您可以使用 QStandardPaths::AppLocalDataLocation
,它在非 Windows 平台上具有 AppDataLocation
的含义。
在使用标准路径之前,您必须通过 QCoreApplication::setApplicationName
设置您的应用程序名称,并使用 setOrganizationName
或 setOrganizationDomain
设置您的组织名称。路径将取决于这些,因此请确保它们对您来说是独一无二的。如果您更改了它们,您将无法访问旧设置,因此请确保您坚持使用对您有意义的名称和域。
不保证该路径存在。如果没有,您必须自己创建它,例如使用 QDir::mkpath
.
int main(int argc, char ** argv) {
QApplication app{argc, argv};
app.setOrganizationDomain("whosebug.com");
app.setApplicationName("Q32525196.A32535544");
auto path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
if (path.isEmpty()) qFatal("Cannot determine settings storage location");
QDir d{path};
if (d.mkpath(d.absolutePath()) && QDir::setCurrentPath(d.absolutePath())) {
qDebug() << "settings in" << QDir::currentPath();
QFile f{"settings.txt"};
if (f.open(QIODevice::WriteOnly | QIODevice::Truncate))
f.write("Hello, World");
}
}
我的程序需要 read/write 一个文本(只有几行)文件及其设置到磁盘。在代码中指定路径可能在一个平台上运行良好,例如 windows,但如果在 Linux 上运行它,则该路径不是跨平台的。
我正在寻找与 QSettings
类似的解决方案,该解决方案将设置保存到不同的路径或具有处理此问题的本机方法。程序员不需要处理细节。但文本文件不适合保存为 QSettings
.
获得这样的路径不需要用户交互。文本文件应在应用程序重新启动后持续存在。不能是临时文件。
Qt 中是否有现成的解决方案,应该使用什么API?
如果要保存一些用户相关数据,可以使用QDir::homePath()
获取用户主目录路径。
有QDir
to handle paths to dirs, QFileInfo
for platform independent file information and QDir
's homePath()
我的建议是使用这些 类 并使用 QDir::home()
或 QDir::homePath()
找到写入的目录,因为用户在他的 homedir 中有写权限并且它存在在每个平台上。
您可以将文件存储在应用程序目录中。看看QCoreApplication::applicationDirPath()
.
来自 Qt 文档:
Returns the directory that contains the application executable.
应用程序特定设置的存储位置因平台而异。 Qt 5 通过 QStandardPaths
.
通常,您会将每个用户的设置存储在 QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)
中。如果您希望设置不保留在 Windows 上用户的漫游配置文件中,您可以使用 QStandardPaths::AppLocalDataLocation
,它在非 Windows 平台上具有 AppDataLocation
的含义。
在使用标准路径之前,您必须通过 QCoreApplication::setApplicationName
设置您的应用程序名称,并使用 setOrganizationName
或 setOrganizationDomain
设置您的组织名称。路径将取决于这些,因此请确保它们对您来说是独一无二的。如果您更改了它们,您将无法访问旧设置,因此请确保您坚持使用对您有意义的名称和域。
不保证该路径存在。如果没有,您必须自己创建它,例如使用 QDir::mkpath
.
int main(int argc, char ** argv) {
QApplication app{argc, argv};
app.setOrganizationDomain("whosebug.com");
app.setApplicationName("Q32525196.A32535544");
auto path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
if (path.isEmpty()) qFatal("Cannot determine settings storage location");
QDir d{path};
if (d.mkpath(d.absolutePath()) && QDir::setCurrentPath(d.absolutePath())) {
qDebug() << "settings in" << QDir::currentPath();
QFile f{"settings.txt"};
if (f.open(QIODevice::WriteOnly | QIODevice::Truncate))
f.write("Hello, World");
}
}