標籤:qt 行動裝置 App開發 windows phone 8
搭建Qt 5.3.1 for Windows Phone 8開發環境
目前Qt已經支援了Android以及iOS的開發,我也親自嘗試過在Android和iOS上的開發,其中在Android這一塊研究的較深,也製作出了第一款獨立遊戲《吃藥了》。在Qt的新版本5.3的發布中,官方宣布支援WindowsPhone 8/8.1的開發。過了兩個月了,我也積極嘗試一下,看看使用最新的Qt 5.3.1版本如何搭建WP8的開發環境。
原創文章,反對未聲明的引用。原部落格地址:http://blog.csdn.net/gamesdev/article/details/38568903
1、硬體要求
首先就是硬體了。開發WindowsRT/Windows Phone得天獨厚的優勢是,我的筆記本是64位的系統,CPU是Intel Core i7-4700MQ四核處理器,記憶體容量是4G,且運行Windows 8.1作業系統。一般幾年前的電腦可能無法勝任這樣的開發,因為要支援Windows Phone的開發,CPU必須支援Hyper-V技術。這是微軟提出的虛擬化技術,相當於在Windows 8.1下運行Windows Phone虛擬機器。有關Hyper-V的要求,我查了一下,CPU必須是64位的,並且支援硬體自我保護(DEP)功能,並且已啟動;記憶體最少2G。我的電腦馬馬虎虎滿足需求,所以能夠順利地進行Windows Phone開發了。
2、軟體要求
首先一個要求,就是安裝Windows8/8.1作業系統。Windows 7究竟可不可以呢?看了網上的文章,可能不行……
其次我看了Qt協助文檔的“Qt forWinRT”主題,瞭解到要支援Windows Phone的開發,需要安裝對應的Visual Studio。對於我們關注的Windows Phone 8/8.1,需要安裝Visual Studio 2012 for Windows Phone。不過現在是什麼時代了,我迫不及待地使用最新版的Visual Studio。於是到這個網站,擷取ed2k資源,開啟迅雷開始高速下載最新版Visual Studio 14。Visual Studio14在安裝的時候有組件的選擇,到時候記得選擇Windows Phone SDK就好了。
最後Qt是必不可少的,在qt-project.org上下載最新“Qt5.3.1 for Windows RT 32-bit (647 MB)”,然後解壓到合適的位置就行了。
安裝順序是VisualStudio 14→Qt 5.3.1 for Windows RT。隨後開啟Qt內建的Qt Creator。
3、測試第一個程式
首先開啟Qt Creator,也就是附帶在Qt5.3.1上的IDE。建立一個QML項目,設定構建套件,如下:
產生好的代碼如下所示,這裡稍作了一些修改:
我這裡首先使用案頭的套件構建一下,結果如下所示:
一切正常。
4、開始移植Windows Phone 8
接下來我將嘗試將例子程式移植到Windows Phone 8中。如第一張圖所示,我們可以選擇實體機套件以及模擬器(Emulator)套件。對於沒有實體機的同行們來說只能選擇Emulator了。當我們按照正常步驟,構建,再運行時,會彈出Windows Phone虛擬機器,看起來一切正常:
但是這裡有一個坑。過一會兒程式啟動後會變得空白一片:
下面也會彈出
qt.winrtrunner:"E:/QtProject/build-TestQuickForWinPhone8-Qt_5_3_for_Windows_Phone_8_x86_MSVC2012_32bit_Emulator-Release/release/AppxManifest.xml"does not exist.
qt.winrtrunner:"E:/QtProject/build-TestQuickForWinPhone8-Qt_5_3_for_Windows_Phone_8_x86_MSVC2012_32bit_Emulator-Release/release/AppxManifest.xml"does not exist.
這樣的紅字。後面瞭解到這個問題不影響的。只是我們如何才能顯示程式呢?
5、介面,你快回來
“Qt for WinRT”這篇文章講到了,我們在測試的時候,Qt會提供一個小工具,叫qd3dservice。它可以即時地將著色器編譯並呈現給應用程式。因為作為支援Qt渲染的OpenGL,在遇上微軟的手機後,不得不“改頭換面”,披著Direct3D的外衣來“見”Windows Phone 8手機。於是需要通過Google Code中一個項目ANGLE,將OpenGL ES2.0的著色器代碼轉換成D3D著色器。剛才無法顯示介面,原因是作為介面依賴的著色器沒有被載入。
解決方案也很簡單,在QtSDK的bin目錄下運行不帶參數的qtd3dservice就行了。然後再開啟我們編譯的程式:
這樣稍微好一點了,至少我們看到了介面,可是一大堆方塊又讓我們犯愁了。這又是一個坑那麼如何才能讓我們看到文字呢?
6、文字,你快回來
看了看Qt 5.3.1for Windows Phone的目錄結構,一個顯著的不同是在bin和lib檔案夾中都有一個名為“font”的目錄,這個目錄是存放與介面顯示相關的字型的。預設打包的時候會包含這些字型。等等,我們剛剛就這樣運行程式,可是沒有進行打包啊。那麼如何進行打包呢?這還得靠我們剛剛安裝的VS14。首先定位$${YourProjectDirctory}中,開啟命令提示字元,輸入:
$${QTDIR}/5.3/winphone_x86/bin/qmake -tp vcYourProject.pro "CONFIG+=windeployqt"
我這裡是這樣的:
運行後,發現uuidgen找不到。這又是一個坑。開始我儘力地去尋找uuidgen.exe,甚至去網上下載了一個uuidgen.exe,並且放在了C:/Windows/system32中,結果都沒有起作用!所以說這又是一個坑。不過這個錯誤並不影響這一步操作,一些必要的Qt和VS專案檔也能夠順利產生。
此時用VS14開啟產生的vcxproj檔案。如下所示:
此時點擊deploy,試試看。結果報錯!
C:\Program Files(x86)\MSBuild\Microsoft\WindowsPhone\v8.0\Microsoft.Phone.Packaging.targets(637,9):error : The ‘ProductID‘ attribute is invalid - The value ‘{}‘ is invalidaccording to its datatype ‘http://WPCommontypes:ST_Guid‘ - The Patternconstraint failed.
這就是uuidgen坑人的地方了。因為無法產生ProductID,所以無法部署打包。
當物之急就是能夠找到產生uuid的方法。這裡有好幾種方法。
(1) VS中有一個叫guidgen.exe的工具,和uuidgen只差一個字母。可以用它來產生uuid;
(2) 去網上下載uuidgen.exe,那是1996年微軟的老物了,但在命令符下仍然能夠產生uuid;
(3) 大家都有Chrome瀏覽器吧,教大家如何使用Chrome產生uuid。事實上任何js解譯器環境都可以,包括QML Engine。開啟Chrome,Ctrl + Shift + J,開啟JS控制台,然後輸入下面的JS代碼:
function getGUID( ){function _p8(s) {var p = (Math.random().toString(16)+"000000000").substr(2,8);return s ? "-" + p.substr(0,4) + "-" + p.substr(4,4) : p ;}return _p8() + _p8(true) + _p8(true) + _p8();}getGUID( );
斷行符號,就能夠產生一個合法的uuid了。這裡我產生的uuid是:
684cebbf-bb4a-857b-9a1e-746feb967cd3
我們需要做的是,進入項目目錄,編輯WMAppManifest.xml,找到ProductID欄位,將我們產生的uuid放在大括弧裡面,儲存,這樣就好了。
然後進入VS14,點擊deploy,然後Ctrl + F5全速運行。記得在運行之前運行qtd3dservice。運行結果如下所示:
大功告成!經過兩天的嘗試和提問,我終於能夠在Windows Phone上面成功地運行Qt程式了。有關Windows Phone上面更多開發方面的問題,有時間我會研究的。
7、總結
這裡作一個小小的總結:
1、 Windows Phone應用安裝包的尾碼是.xap檔案,可以用7-zip等壓縮解壓工具開啟,開啟後發現和Android的apk安裝包的目錄結構大同小異。
2、 如上面介紹,用Qt開發WindowsPhone 8還存在很多坑,再比如說這個例子,想點擊左上方的File菜單,就不靈敏,有時候Exit選項會獨佔整個螢幕,顯得這個螢幕很空;此外,一些重要的Qt模組比如說我迫切需要的Enginio,並沒有一併移植過來。所以說開發Windows Phone 8應用還是實驗性的,希望在Qt 5.4中能夠做得更好。
3、 如果不希望每次啟動qtd3dservice線上編譯著色器,那麼可以使用“qtd3dservice --list-binary --qrc --device 0 --app {684cebbf-bb4a-857b-9a1e-746feb967cd3}--output /path/to/project/shaders.qrc”來產生shader資源,然後再修改pro檔案,添加這一行:“RESOURCES+= shaders.qrc”,最後重新編譯打包。
4、 其實qtd3dservice只是一個初步可行的辦法,當時考慮Windows的政策不允許JIT編譯。我在jira上看到Qt團隊討論的結果是,qtd3dservice將在Qt5.4中移除。因為(1)Windows 8.1支援裝置線上(JIT)著色器的編譯;(2)qtd3dservice只是一個實驗性的解決方案,以後不必維護;(3)可以使用scene-graph採取的cache方法來應用到著色器當中。(參考這裡)
5、 即使使用了Hyper-V技術,在模擬器上體驗WindowsPhone 8的效果還是比不上真機。我曾經在蘇寧電器城中使用諾基亞Lumia 525成功運行Digia的Qt應用Quick Forcast。有條件的話,還是買一台真機進行開發測試吧。