起因: 想將一些非圖片類型的文件,如可執行文件(exe)或批處理文件(bat)等嵌套到QT中做為資源保存,並實現可調用
疑難點:
該問題主要疑難在於思路;網絡上有很多介紹QT資源的,多數是照著QT的文檔寫的,多為圖片類型文件如何加入資源和調用;而我要做的則不一樣(其實後來想想也是一樣的),要嵌入的非圖片類型,主要的差別在於 - 圖片類型資源可使用QT的方法直接調用,而非圖片資源則不行;
嵌入資源是比較好解決的,但如何調用才是重點。
我的思路是來自於國外論壇上的一個帖子,具體網址忘記了,帖子中有位大蝦提到說,其實資源在QT中也是以文件形式讀取的(QFile),但要調用的話,則應該將該資源讀出,並寫成一個臨時文件,再去調用。
為什麼要這樣呢?其實多看看QT資源的中間文件,想想也就知道了。在QT編譯資源時,會將資源以二進制方式讀取,並整理成幾個數據結構,標識了資源的名稱、大小和內容等等。這些數據是以代碼形式鏈接到軟件裏的,雖然在讀取時可以用QFile讀取,但此時讀取的QFile仍然是代碼,而非可被調用的文件。所以就需要將QFile代碼先轉換成臨時文件,這樣才可以被調用。
類代碼:
Res2File.h
- /**
- *=====================================================================
- * Copyright (c) Power Star, Inc. All rights reserved.
- *---------------------------------------------------------------------
- * File Name: Res2File.h
- *
- * Description:
- * copy the resource to temp file
- *
- * History:
- * 2012.05.25 ryan.wang Initial version
- *
- *=====================================================================
- **/
- #ifndef _Res2File_h_
- #define _Res2File_h_
- #include "qtbase.h" //include many qt classes, created manually
- class Res2File
- {
- public:
- Res2File( QString resfilename, QString subffix="" );
- ~Res2File();
- bool open();
- void close();
- void create();
- void clear();
- QString getfile();
- private:
- QFile m_fileres;
- QFile m_filetemp;
- QFileInfo m_fileinfo;
- QString m_nameres;
- QString m_nametemp;
- QString m_pathtemp;
- };
- #endif /* _Res2File_h_ */
Res2File.cpp
- Res2File *bat = new Res2File(":/white.bat"); //要用資源的別名才可以正常打開
調用上例後,將在本地目錄下產生一個臨時文件,直到bat被刪除。
餘留問題:
不懂為啥,在讀取資源時,非要用alias才可以正常讀取,用相對路徑就讀不出來。如果有誰知道該如何解決這問題的,請告訴我,感激不盡。
阅读(3970) | 评论(0) | 转发(0) |