如何在Qt中以跨平台的方式获取设置存储路径?

13

我的程序需要读写一个文本(仅几行)文件并将其设置保存到磁盘上。在代码中指定路径可能在某个平台上(如Windows)很好用,但如果在Linux上运行,则该路径不是跨平台的。

我正在寻找与 QSettings 类似的解决方案,可以将设置保存到不同的路径或具有其本地处理方式。程序员不需要关心细节。但是,文本文件不适合保存为 QSettings 中的值。

获取这样的路径不需要用户交互。文本文件应该持续存在于应用程序重启之间。它不能是临时文件。

Qt 中是否有现有的解决方案,应使用哪个 API?

4个回答

15

应用程序特定设置存储的位置因平台而异。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("stackoverflow.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");   
  }
}

1
这是旧的内容,但如果有其他人到达这里...在QT 5.11中,似乎是QDir :: setCurrent(const QString&path)函数。 - Nick
@Nick 我不知道你想说什么。那与问题/答案有什么关系?我没有尝试在任何地方更改工作目录,也不是问题的内容。 - Kuba hasn't forgotten Monica

-1
如果您想保存一些与用户相关的数据,可以使用QDir::homePath()获取用户主目录路径。

这确实在所有情况下都“可行”。但它非常古老的Unix中心化,并导致糟糕的用户体验。即使在macOS上,尽管它是Unix,也很不礼貌。一些应用程序确实只是将其推迟并写入〜/ .appname。但这对任何人来说都不好。在Unix上,您应该遵循FreeDesktop规范并写入〜/ .config / app name [ / ... ]。Qt的标准路径会处理它。 - Kuba hasn't forgotten Monica

-1

QDir来处理目录路径,QFileInfo用于平台无关的文件信息,以及QDirhomePath()

我的建议是使用这些类,并使用QDir::home()QDir::homePath()查找要写入的目录,因为用户在其主目录中具有写权限,并且该目录在每个平台上都存在。


homePath 然后呢?在 Windows 上,它位于 %USERPROFILE% 中,如果你随意涂鸦,可能会惹上麻烦。在 OS X 和 Linux 上,它位于主目录中,需要遵循特定于平台的路径约定。例如,在 OS X 上捕获您写入到 .~/xyz 的用户将不喜欢你。QDir :: homePath 是一个遗留问题,对于跨平台设置中的编写基本上是无用的。您可以从那里读取,但是不能在没有用户告诉您要写入哪里的情况下进行写入。 - Kuba hasn't forgotten Monica

-2

您可以将文件存储在应用程序目录中。请查看{{link1:QCoreApplication :: applicationDirPath()}}。

来自Qt文档:

返回包含应用程序可执行文件的目录。


1
这通常是不可写的,所以这是一个坏主意。 - Kuba hasn't forgotten Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接