【问题标题】:How to get a settings storage path in a cross-platform way in Qt?如何在 Qt 中以跨平台的方式获取设置存储路径?
【发布时间】:2015-09-11 13:55:06
【问题描述】:

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

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

应该不需要用户交互来获得这样的路径。文本文件应该在应用程序重新启动时保持不变。不能是临时文件。

Qt 中是否有现成的解决方案,应该使用什么 API?

【问题讨论】:

    标签: c++ qt cross-platform


    【解决方案1】:

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

    【讨论】:

    • 这是旧的,但万一其他人到达这里.. 在 QT 5.11 中,它似乎是 QDir::setCurrent(const QString &path)
    • @Nick 我不知道你想说什么。这与问题/答案有什么关系?我不会尝试在任何地方更改工作目录,这不是问题。
    【解决方案2】:

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

    【讨论】:

    • 确实,这在所有情况下都“有效”。然而,它是非常古老的以 Unix 为中心的,并导致糟糕的用户体验。即使在 macOS 上,它也是不礼貌的,尽管它是 Unix。有些应用程序确实只是将其踢出并写信给~/.appname。但这对任何人都不好。在 Unix 上,您应该遵循 FreeDesktop 规范并写信给~/.config/app name[/...]。 Qt 的标准路径会处理它。
    【解决方案3】:

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

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

    【讨论】:

    • homePath 然后呢?在 Windows 上,它位于 %USERPROFILE% 中,如果您开始在那里随意乱涂乱画,您可能会遇到麻烦。在 OS X 和 Linux 上,它位于您需要遵循特定于平台的路径约定的主目录中。嗯。在 OS X 上发现你写信给.~/xyz 的用户会不喜欢你。 QDir::homePath 是遗留的遗留物,对于在跨平台环境中编写基本无用。您可以从那里阅读,但如果用户不告诉您在哪里写,您就不能写。
    【解决方案4】:

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

    来自 Qt 文档:

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

    【讨论】:

    • 这通常是不可写的,所以这是个坏主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    相关资源
    最近更新 更多