首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从非Qt函数访问Qt资源数据

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

Stack Overflow用户
提问于 2014-10-20 21:00:41
回答 2查看 3.4K关注 0票数 12

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

我正在使用OSX,但我假设这些问题与平台无关。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-21 15:46:45

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

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

代码语言:javascript
复制
mac {
    BUNDLE = $$OUT_PWD/$$TARGET$$quote(.app)/Contents
    QMAKE_POST_LINK += ditto \"$$PWD/data.txt\" \"$$BUNDLE/Resources/\";
}

给定上面的项目文件,使用QCoreApplication::applicationDirPath()作为一个在获取文件时有用的路径:

代码语言:javascript
复制
#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应用程序包中的命名约定。我们这里不使用Qt资源系统。

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

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

您可以通过流缓冲区映射常量QResource::data() 到输入流

如果资源是isCompressed(),那么首先需要将其解压缩到临时区域。您还可以使用禁用资源压缩来避免解压步骤。您可以使用像upx这样的完整可执行压缩程序,当代码运行时,所有的东西都已经解压缩并准备使用了。

票数 6
EN

Stack Overflow用户

发布于 2016-02-10 16:29:16

如何用一个QFile对象打开资源文件,用一个QDataStream对象包装它,然后用boost::iostreams::std::basic_istream对象包装它,这是从std::basic_istream的专门化派生出来的?听起来很复杂,但不需要太多的代码行,请参阅这个答案

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26474832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档