如何在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 设置您的应用程序名称,并使用 setOrganizationNamesetOrganizationDomain 设置您的组织名称。路径将取决于这些,因此请确保它们对您来说是独一无二的。如果您更改了它们,您将无法访问旧设置,因此请确保您坚持使用对您有意义的名称和域。

不保证该路径存在。如果没有,您必须自己创建它,例如使用 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");   
  }
}