据我所知,在Qt应用程序中打包非代码资源(如数据文件)的方法是使用资源系统。但是,如果我想使用非Qt函数访问资源,该怎么办?例如,我可能有一个.txt或.csv文件,其中包含一些我想使用ifstream访问的应用程序数据。使用“.”似乎不管用。语法代替非Qt函数和类的文件名。是否有一个单独的工作流来打包非Qt函数在应用程序中使用的数据?
我正在使用OSX,但我假设这些问题与平台无关。
发布于 2014-10-21 15:46:45
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应用程序包中的命名约定。我们这里不使用Qt资源系统。
如果希望使用Qt资源系统并直接而不是通过QFile访问资源数据,则QResource类提供对捆绑在可执行文件中的资源的访问。
如果您控制下的代码坚持使用ifstream作为数据输入,那么它是人工限制的,应该被修复。它应该使用istream,因为该类可以由任何东西支持,而不一定是一个文件。如果是您无法控制的代码,则可以在ifstream上设置QLocalSocket。
您可以通过流缓冲区映射常量QResource::data() 到输入流。
如果资源是isCompressed(),那么首先需要将其解压缩到临时区域。您还可以使用禁用资源压缩来避免解压步骤。您可以使用像upx这样的完整可执行压缩程序,当代码运行时,所有的东西都已经解压缩并准备使用了。
发布于 2016-02-10 16:29:16
如何用一个QFile对象打开资源文件,用一个QDataStream对象包装它,然后用boost::iostreams::std::basic_istream对象包装它,这是从std::basic_istream的专门化派生出来的?听起来很复杂,但不需要太多的代码行,请参阅这个答案。
https://stackoverflow.com/questions/26474832
复制相似问题