【问题标题】:Qt read files from Resources Bundle DirectoryQt 从资源包目录中读取文件
【发布时间】:2017-03-06 01:16:21
【问题描述】:

我有一个 Qt 程序,里面有一些 .txt 文件。一开始我只是从我创建的某个目录中读取它们,但时间已经到了,有必要为 Mac OSX 创建一个包。我设法在cmake的帮助下将.txt文件放在bundle的.app目录中的/Resources中,但我没有找到如何从那里读取它们。

如何读取这些文件,以便可以从任何地方运行该应用程序?

【问题讨论】:

  • 如果您希望应用程序是跨平台的,最好使用Qt's resource system 而不是 Mac 特定的应用程序包。
  • @MrEricSir 我这样做了,但由于某种原因我无法使用 ifstreams 从文件中读取。还是我做错了什么?同样的方法(通过 cmake)在处理 .png 时是成功的,但是 .txt 文件没有被读取。
  • C++的ifstream不知道怎么从Qt的内部格式读取,但是对应的Qt文件管理类肯定可以,比如QFileQTextStream

标签: c++ macos qt cmake


【解决方案1】:

正如@MrEricSir 所指出的,最好将Qt resource system 与本机Qt 类一起使用来通过流读取文件。

但是,如果您仍然需要将数据存储在单独的文件中,您可以简单地使用 QCoreApplication::applicationDirPath() 方法返回可执行文件的路径并将其包装到您自己的函数中,以尊重不同的应用程序结构平台。

例如:

QString getResourcesPath()
{
#if defined(Q_OS_WIN)
    return QApplication::applicationDirPath() + "/";
#elif defined(Q_OS_OSX)
    return QApplication::applicationDirPath() + "/../Resources/";
#elif defined(Q_OS_LINUX)
    return QApplication::applicationDirPath() + "/../share/yourapplication/";
#else
    return QApplication::applicationDirPath() + "/";
#endif
}

此示例代码假定:

  • Windows 上,您将资源存储在与可执行文件相同的目录中。
  • ma​​cOS 上,您将资源存储在 .app 捆绑包的 Resources 目录中。根据Apple developer docs,可执行文件存储在yourapplication.app/Contents/MacOS目录中,资源文件通常存储在yourapplication.app/Contents/Resources中。代码只是移动到相对于您的可执行文件的Resources 目录。
  • Linux 上,您使用的是标准 Linux 目录结构,该目录结构利用了单独的 binshare 目录。当然,您可以使用opt 目录或根本不捆绑您的应用程序——在这种情况下,您不需要任何Linux 的条件包含。如需了解更多信息,请阅读 Linux Filesystem Hierarchy Standard

【讨论】:

  • 这行得通,谢谢。但似乎你不能用#elif 做到这一点,它只适用于每个返回的单独#ifndef,就像它所说的here
  • @fminkin 编辑了代码,感谢指出。 #elif defined 指令应该可以工作。
  • 谢谢。但是如何在 Qt 项目中包含这些文件并指示构建系统将它们放在每个平台开始的适当位置?稍后使用 QStandardPaths 很容易找到目录,但是如何在应用安装时将文件部署到其中?
  • @Oscar 您可以为此使用QMAKE_POST_LINKQMAKE_EXTRA_TARGETSINSTALLS
  • 感谢您的信息。确定文件在每个平台上的最终位置似乎仍然有点挑剔,但我想这是不可避免的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 2016-06-17
  • 1970-01-01
  • 2021-11-21
相关资源
最近更新 更多