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

时间:2015-09-11 13:55:07

标签: c++ qt cross-platform

我的程序需要读取/写入文本(只需几行)文件及其设置到磁盘。在代码中指定路径可能在一个平台上运行良好,如Windows,但如果在Linux上运行它,则路径不是跨平台的。

我正在寻找一种类似QSettings的解决方案,它可以将设置保存到不同的路径,或者有其本机方式来处理这个问题。程序员不需要处理细节。但是文本文件不适合保存为QSettings中的值。

无需用户交互即可获得此类路径。文本文件应该在应用程序重新启动时保持不变。它不能是临时文件。

Qt中是否存在现有的解决方案以及应该使用的API是什么?

4 个答案:

答案 0 :(得分:9)

特定于应用程序的设置存储的位置因平台而异。 Qt 5通过QStandardPaths提供了合理的解决方案。

通常,您会在QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)中存储每个用户的设置。如果您希望设置不会在Windows上的用户漫游配置文件中保留,则可以使用QStandardPaths::AppLocalDataLocation,它在非Windows平台上具有AppDataLocation的含义。

在使用标准路径之前,您必须使用QCoreApplication::setApplicationNamesetOrganizationName通过setOrganizationDomain和您所在组织的名称设置应用名称。路径将取决于这些,因此请确保它们对您而言是独一无二的。如果您更改了它们,您将无法访问旧设置,因此请确保您坚持使用对您有意义的名称和域名。

不保证路径存在。如果没有,您必须自己创建,例如使用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 :(得分:-1)

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

答案 2 :(得分:-1)

QDir来处理dirs的路径,QFileInfo用于处理与平台无关的文件信息和QDir&#39; s homePath()

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

答案 3 :(得分:-1)

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

来自Qt文档:

  

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