Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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函数访问Qt资源数据_C++_Qt_Packaging - Fatal编程技术网

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

C++ 如何从非Qt函数访问Qt资源数据,c++,qt,packaging,C++,Qt,Packaging,据我所知,在Qt应用程序中打包非代码资源(如数据文件)的方法是使用资源系统。但是,如果我想使用非Qt函数访问资源,该怎么办。例如,我可能有一个.txt或.csv文件,其中包含一些我希望使用ifstream访问的应用程序数据。对于非Qt函数和类,使用“:…”语法代替文件名似乎不起作用。是否有一个单独的工作流用于打包应用程序中非Qt函数使用的数据 我正在使用OSX,但我假设这些问题与平台无关。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;
}
#包括
#包括
#包括
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同上即可查看文档。