2016-07-08 32 views
3

我很難搞清楚如何從不是來自Qt的函數訪問Qt資源文件。具有非Qt函數的Qt資源文件

我已閱讀How to access Qt resource data from non-Qt functions發佈的問題,但給出的答案只是提供了一個解決方法,如何將文件包含在與可執行文件相同的目錄中,這不是我想要做的。我想確保文件存在,並且在我的程序運行時不能被篡改(這就是爲什麼我要使用qrc路由)。

給你一些背景:我在一個使用OpenCV's Machine Learning Libraries的程序中使用它,我需要加載一個訓練文件。加載處理需要one argument,這是一個.xml文件的路徑。

目前唯一的解決方案是我每次加載文件時使用QFile打開qrc文件,然後用我的可執行文件臨時將該文件輸出到目錄中,然後使用我的OpenCV加載文件加載此文件函數,然後從我的目錄中刪除臨時文件。

這將是一個相當混亂的解決方法,我想避免。任何解決我的問題將不勝感激。

+0

而且是不是有一個功能,您可以提供數據的緩衝區?或者更好,數據在大塊? – peppe

+3

從3秒鐘的谷歌搜索和知道少於零關於OpenCV,看起來像你可能想要在MEMORY模式下創建一個'FileStorage',填充它並使用'CvStatModel :: read'而不是'load'? – peppe

+0

不明白。你想使用.qrc作爲輸入文件格式嗎?而不是將其嵌入到您的程序中?爲什麼? – ilotXXI

回答

3

感謝@peppe的提示使用CV :: FileStorage和CvStatModel ::閱讀

這裏是我使用的解決方案:

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()); 
}