如何採用外部資源檔,開發Windows QT?
啟稿: 2015/01/01
完稿: 2015/01/01
QT CueTai線索台
跨平台實作05-跨平台實作進階:採用外部資源檔,Windows下之實例
看過Apple的Mac OS X及iOS使用者可以自行放入想要的音效檔架構範例後,現在來看Windows作業系統的範例。
l 在QT下建置Windows下執行檔
Windows作業系統下的exe執行檔就純粹是執行檔,並沒有封裝結構;所以可以自行在檔案總管自行複製整個Resources/目錄到執行檔所在目錄下,並不需要特殊處理的;但是QT若能提供如同之前我們在analogclock.pro中為了Mac OS X所加入的巨集命令QMAKE_BUNDLE_DATA而能自動幫我們建立的話,就會非常方便而不至於忘記。
根據上次在Mac OS X app上的經驗,這方面的訊息可以用"deployment" keyword來試著得到你要的資訊;在QT說明畫面的搜尋欄位輸入keyword " QT for Windows deployment",得到的說明如下:
這也是一篇相當豐富而有用的資料,不過它重點放在靜態及動態連接檔編譯、所需DLL確認及最後封裝發佈!很可惜沒有提到我們想要的巨集方法!不過下次我們研究如何封裝發佈時,將可作為參考。若再加上keyword "Bundle"也找不到相關資訊;上網Google去搜尋,曾經有網文提到要用巨集INSTALLS來進行,但很可惜的是實測的結果不work,但是在QT說明中搜尋所得到的結果似乎就是這個巨集,下面就是利用keyword "Qmake INSTALLS"顯示巨集INSTALLS的用法:
照原文Specifies a list of resources that will be installed when make install or a similar installation procedure is executed 的意思,不就是在安裝或類似的過程中將所列的資源檔一起安裝,但為什麼不能work?仔細接著有提到,進一步資訊請看Installing Files!
連結到Installing Files的說明就會發現此功能似乎是針對Unix作業平台設計的,所以Windows作業平台就不作用嗎?目前為止還是沒有答案,所以也只能自行在檔案總管複製整個Resources/目錄到執行檔所在目錄下;若各位先進有方法,麻煩分享!
l 修改程式
首先在Windows作業系統平台上我們會手動複製整個Resources/目錄到建置目錄下,所以我們在程式中取用的時候就如同當初在Mac OS X寫法一樣:
soundQuarter=newQSound("Resources/alarm.wav");
不過QT在Windows作業系統平台上,建置時的初始設定目錄位置在debug與release是完全不同的兩個目錄,如在debug時建置的目錄如下:
E:\QtWork\build-analogclock-Desktop_Qt_5_3_0_MinGW_32bit-Debug
如在release時建置的目錄如下:
E:\QtWork\build-analogclock-Desktop_Qt_5_3_0_MinGW_32bit-Release
但建置出來的執行檔exe卻放在更下層的目錄;如在debug時執行檔放在的目錄如下:
E:\QtWork\build-analogclock-Desktop_Qt_5_3_0_MinGW_32bit-Debug\debug
如在release時執行檔放在的目錄如下:
E:\QtWork\build-analogclock-Desktop_Qt_5_3_0_MinGW_32bit-Release\release
所以為了程式的一致性,我們必須在原始碼中判斷目前的狀態,無論ebug或release,都將目前執行目錄移到執行檔所在目錄位置;因此我們在analogclock.h此S_ AbsPath變數,就是要紀錄最後要到的執行目錄位置。
程式一開始執行時就要知道目前是在何種狀況,來改變執行時所在目錄位置,我們用OpNow來知道是在開發平台debug/release狀態下,還是建置後正式執行app;所以程式一開始改成如下:
clock.S_CurrentPath=clock.D_Current.path()+"/";
if(clock.OpNow==clock.DEBUG_)
//#ifdefQ_DEBUG
clock.S_OpPath="debug/";
elseif(clock.OpNow==clock.RELEASE_)
clock.S_OpPath="release/";
else
clock.S_OpPath="";
clock.S_ResPath="Resources/";
clock.S_AbsPath=clock.S_CurrentPath+clock.S_OpPath;
QDir::setCurrent(clock.S_AbsPath);
若要取資源檔,都是往Resources/目錄下取檔案即可!如下用法:
soundQuarter=newQSound(S_ResPath+"alarm.wav");
l 建置與執行
在在QT開發平台debug/release狀態下,記得最前端加入以下一行程式:
clock.OpNow=clock.DEBUG_; //APP_,DEBUG_,RELEASE_
要建置正式執行app則改為:
clock.OpNow=clock.APP_; //APP_,DEBUG_,RELEASE_
如此就大功告成,在Window作業平台目錄結構如下:
l 延伸應用及問題
接下來Android平台會像Windows, Mac OS還是iOS呢?
留言列表