搭建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會提供一個小工具,叫qtd3dservice。它可以即時地將著色器編譯并呈現給應用程序。因為作為支持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代碼:
[javascript]?view plaincopy
回車,就能夠產生一個合法的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。有條件的話,還是買一臺真機進行開發測試吧。
總結
以上是生活随笔為你收集整理的搭建Qt 5.3.1 for Windows Phone 8开发环境的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QML设计登陆界面
- 下一篇: 小众编程语言同样值得你关注