Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt从资源包目录读取文件_C++_Macos_Qt_Cmake - Fatal编程技术网

C++ Qt从资源包目录读取文件

C++ Qt从资源包目录读取文件,c++,macos,qt,cmake,C++,Macos,Qt,Cmake,我有一个Qt程序,里面有一些.txt文件。起初,我只是从我制作的一些目录中读取它们,但时间已经到了,有必要为MacOSX创建一个捆绑包。在cmake的帮助下,我设法将.txt文件放在bundle的.app目录中的/Resources中,但我没有找到如何从那里读取它们 我如何读取这些文件,以便在任何地方运行该应用程序 正如@MrEricSir所指出的,最好将与本机Qt类一起使用,通过流读取文件 但是,如果您仍然需要将数据存储在单独的文件中,您可以简单地使用返回可执行文件路径的方法,并将其包装到您自

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


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

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

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

例如:

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上,您将资源存储在与可执行文件相同的目录中
  • macOS上,您将资源存储在
    .app
    捆绑包的
    resources
    目录中。根据,可执行文件存储在
    yourapplication.app/Contents/MacOS
    目录中,资源文件通常存储在
    yourapplication.app/Contents/Resources
    中。代码只是相对于可执行文件移动到
    资源
    目录
  • Linux上,您使用的是标准的Linux目录结构,使用的是单独的
    bin
    share
    目录。当然,您可以使用
    opt
    目录,或者根本不捆绑您的应用程序——在这种情况下,Linux不需要任何条件包含。有关Linux的更多信息,请阅读

如果你想让应用程序跨平台运行,最好不要使用Mac专用的应用程序包。@Ericsir我这样做了,但由于某些原因,我无法使用ifstreams读取文件。还是我做错了什么?同样的方法(通过cmake)在.png上也取得了成功,但是.txt文件没有被读取。C++的
ifstream
不知道如何读取Qt的内部格式,但是相应的Qt文件管理类肯定会这样做,例如
QFile
QTextStream
,等等。谢谢。但似乎你不能用#elif来做,它只对每个返回使用单独的#ifndef,就像上面所说的那样@fminkin编辑了代码,谢谢你指出。
#elif defined
指令应该有效。谢谢。但是,如何在Qt项目中包含这些文件,并指示构建系统将它们放置在每个平台的适当位置?稍后使用QStandardPath很容易找到目录,但是在安装应用程序时如何将文件部署到目录中?@Oscar您可以使用,或者为此。感谢您提供的信息。确定文件在每个平台上的最终位置似乎有点麻烦,但我想这是不可避免的。