C++ 如何从非Qt函数访问Qt资源数据
据我所知,在Qt应用程序中打包非代码资源(如数据文件)的方法是使用资源系统。但是,如果我想使用非Qt函数访问资源,该怎么办。例如,我可能有一个.txt或.csv文件,其中包含一些我希望使用ifstream访问的应用程序数据。对于非Qt函数和类,使用“:…”语法代替文件名似乎不起作用。是否有一个单独的工作流用于打包应用程序中非Qt函数使用的数据C++ 如何从非Qt函数访问Qt资源数据,c++,qt,packaging,C++,Qt,Packaging,据我所知,在Qt应用程序中打包非代码资源(如数据文件)的方法是使用资源系统。但是,如果我想使用非Qt函数访问资源,该怎么办。例如,我可能有一个.txt或.csv文件,其中包含一些我希望使用ifstream访问的应用程序数据。对于非Qt函数和类,使用“:…”语法代替文件名似乎不起作用。是否有一个单独的工作流用于打包应用程序中非Qt函数使用的数据 我正在使用OSX,但我假设这些问题与平台无关。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;
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
qDebug()用QFile对象打开资源文件,用QDataStream对象包装,然后用boost::iostreams::stream对象包装,后者源自std::basic_istream的专门化,听起来很复杂,但不需要太多代码行,请参见。您可以将资源文件复制到临时文件夹中。为此,请使用QTemporaryDir
创建一个临时文件夹,并在程序完成后自动删除。要访问该文件夹的路径,请使用QTemporaryDir::path()
方法。下面是一个如何使用它的示例:
#include <QTemporaryDir> //You need to include this header
QTemporaryDir temporaryDir;
//Copy the resource file into the temporary folder
QFile::copy(":/exampleprefix/examplefile.txt", temporaryDir.path() + "/examplefile.txt");
//Read the file
std::ifstream fileStream(QString(temporaryDir.path() + "/examplefile.txt").toLatin1().data());
//etc
#include//您需要包含此标题
QTemporaryDir-temporaryDir;
//将资源文件复制到临时文件夹中
QFile::copy(:/exampleprix/examplefile.txt),temporaryDir.path()+“/examplefile.txt”);
//读文件
std::ifstream fileStream(QString(temporaryDir.path()+“/examplefile.txt”).toLatin1().data();
//等
由于Qt资源被压缩到可执行文件中,因此可能会重复。唯一可行的方法是将文件提取到临时文件夹中,以便非Qt代码可以使用它。编写一个函数或类,连接Qt和非Qt代码。然后调用该函数(调用该类的方法)非Qt代码。@HostileFork不太可能,因为资源与QFile
无关。即使使用QIODevice
到iostream
桥,也会大大解决这个问题。@daj“同上--复制目录层次结构,创建和提取存档”由于您使用的是OSX,只需在终端中键入man同上即可查看文档。