c – 如何从非Qt函数访问Qt资源数据

据我了解,在Qt应用程序中打包非代码资源(如数据文件)的方法是使用资源系统.但是,如果我想使用非Qt函数访问资源该怎么办?例如,我可能有一个.txt或.csv文件,其中包含一些我想使用ifstream访问的应用程序数据.似乎不能使用“:…”语法代替非Qt函数和类的文件名.是否有单独的工作流程来打包应用程序中非Qt函数使用的数据?

我正在使用OSX,但我认为这些问题与平台无关.

解决方法:

Qt资源系统的唯一目的是将数据捆绑在可执行文件本身中.如果您不希望将数据集成到可执行文件中,那么您就不能使用资源系统.

在Mac上,如果您希望将“data.txt”从项目源添加到应用程序包,而不是添加到可执行文件本身,请将以下内容添加到.pro文件中:

mac {
    BUNDLE = $$OUT_PWD/$$TARGET$$quote(.app)/Contents
    QMAKE_POST_LINK += ditto \"$$PWD/data.txt\" \"$$BUNDLE/Resources/\";
}

给定上面的项目文件,使用QCoreApplication :: applicationDirPath()获取有关获取文件的路径:

#include <QCoreApplication>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   qDebug() << QCoreApplication::applicationDirPath();
   QFile data(QCoreApplication::applicationDirPath() + "/../Resources/data.txt");
   if (data.open(QIODevice::ReadOnly | QIODevice::Text))
      qDebug() << data.readAll();
   return 0;
}

在上面的示例中,Resources文件夹与Qt资源系统无关.它只是OS X应用程序包中的命名约定.我们这里没有使用Qt资源系统.

如果您希望使用Qt资源系统并直接访问资源数据而不是通过QFile,则QResource类可以访问可执行文件中捆绑的资源.

如果您控制下的代码坚持使用ifstream进行数据输入,那么它是人为限制的,应该修复.它应该使用istream,因为该类可以由任何东西支持,不一定是文件.如果它是您无法控制的代码,则可以在QLocalSocket上设置ifstream.

您可以通过流缓冲区映射常量QResource :: data()to an input stream.

如果资源是Compressed(),那么您需要先将其解压缩到临时区域.您也可以通过disable resource compression来避免减压步骤.您可以使用像upx这样的整个可执行压缩器 – 当您的代码运行时,所有内容都已经解压缩并可以使用.

上一篇:c-如何使用其他Linux平台中的所有dll文件部署Qt应用程序?


下一篇:从OSX“.app”包运行Java导致“错误-10810”