具有非 Qt 函数的 Qt 资源文件

4
我在尝试从一个非Qt函数中访问Qt资源文件时遇到了困难。
我已经阅读了如何从非Qt函数中访问Qt资源数据的问题,但是给出的答案只是提供了一种解决方案,即将文件包含在可执行文件所在的同一目录中,这不是我想要做的。我想确保文件存在,并且在我的程序运行时不能被篡改(这就是为什么我想使用qrc路径)。
为了给你一些背景:我正在使用OpenCV的机器学习库编写一个程序,需要加载一个训练文件。加载过程需要一个参数,即指向.xml文件的路径。

目前我能想到的唯一解决方案是每次加载文件时,使用QFile打开qrc文件,然后将该文件暂时输出到与我的可执行文件相同的目录中,再使用OpenCV加载函数加载该文件,最后从我的目录中删除临时文件。

这将是一个相当麻烦的解决方法,我希望避免。非常感谢任何解决我的问题的方案。


难道没有一个可以提供数据缓冲区的函数吗?或者更好的是,分块提供数据的函数? - peppe
3
从只搜索了约3秒的Google和对OpenCV知之甚少的情况来看,似乎您需要在内存模式下创建一个FileStorage,填充它并使用CvStatModel::read而不是load - peppe
您明白吗?您是否想使用.qrc作为输入文件格式?并不想将其嵌入到程序中?为什么呢? - ilotXXI
可能是使用OpenCV的imread()从qrc中读取图像的重复问题。 - Miki
@ilotXXI 我确实想将文件嵌入程序中。该文件的扩展名为.xml,我会将其添加到我的qt资源文件(即.qrc文件)中。我的问题是如何从Qt资源中获取文件。 - Stanton
1个回答

4

感谢@peppe提供使用cv::FileStorage和CvStatModel::read的技巧。

这是我使用的解决方案:

QFile qFile(":/QtResourceFileName.xml");
if (qFile.open(QFile::ReadOnly))
{
    QTextStream qTextStream(&qFile);
    std::string str = qTextStream.readAll().toStdString();

    cv::FileStorage fileStorage(str, cv::FileStorage::MEMORY);

    cv::Ptr<cv::ml::SVM> svm =
        Algorithm::read<cv::ml::SVM>(fileStorage.getFirstTopLevelNode());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接