搭建Qt 5.3.1 for Windows Phone 8开发环境
目前Qt已經(jīng)支持了Android以及iOS的開發(fā),我也親自嘗試過在Android和iOS上的開發(fā),其中在Android這一塊研究的較深,也制作出了第一款獨(dú)立游戲《吃藥了》。在Qt的新版本5.3的發(fā)布中,官方宣布支持WindowsPhone 8/8.1的開發(fā)。過了兩個(gè)月了,我也積極嘗試一下,看看使用最新的Qt 5.3.1版本如何搭建WP8的開發(fā)環(huán)境。
原創(chuàng)文章,反對(duì)未聲明的引用。原博客地址:http://blog.csdn.net/gamesdev/article/details/38568903
1、硬件要求
首先就是硬件了。開發(fā)WindowsRT/Windows Phone得天獨(dú)厚的優(yōu)勢(shì)是,我的筆記本是64位的系統(tǒng),CPU是Intel Core i7-4700MQ四核處理器,內(nèi)存容量是4G,且運(yùn)行Windows 8.1操作系統(tǒng)。一般幾年前的計(jì)算機(jī)可能無法勝任這樣的開發(fā),因?yàn)橐С諻indows Phone的開發(fā),CPU必須支持Hyper-V技術(shù)。這是微軟提出的虛擬化技術(shù),相當(dāng)于在Windows 8.1下運(yùn)行Windows Phone虛擬機(jī)。有關(guān)Hyper-V的要求,我查了一下,CPU必須是64位的,并且支持硬件自我保護(hù)(DEP)功能,并且已啟動(dòng);內(nèi)存最少2G。我的計(jì)算機(jī)馬馬虎虎滿足需求,所以能夠順利地進(jìn)行Windows Phone開發(fā)了。
2、軟件要求
???????? 首先一個(gè)要求,就是安裝Windows8/8.1操作系統(tǒng)。Windows 7究竟可不可以呢?看了網(wǎng)上的帖子,可能不行……
其次我看了Qt幫助文檔的“Qt forWinRT”主題,了解到要支持Windows Phone的開發(fā),需要安裝對(duì)應(yīng)的Visual Studio。對(duì)于我們關(guān)注的Windows Phone 8/8.1,需要安裝Visual Studio 2012 for Windows Phone。不過現(xiàn)在是什么時(shí)代了,我迫不及待地使用最新版的Visual Studio。于是到這個(gè)網(wǎng)站,獲取ed2k資源,打開迅雷開始高速下載最新版Visual Studio 14。Visual Studio14在安裝的時(shí)候有組件的選擇,到時(shí)候記得選擇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、測(cè)試第一個(gè)程序
???????? 首先打開Qt Creator,也就是附帶在Qt5.3.1上的IDE。新建一個(gè)QML項(xiàng)目,設(shè)置構(gòu)建套件,如下:
???????? 生成好的代碼如下所示,這里稍作了一些修改:
???????? 我這里首先使用桌面的套件構(gòu)建一下,結(jié)果如下所示:
???????? 一切正常。
4、開始移植Windows Phone 8
???????? 接下來我將嘗試將例子程序移植到Windows Phone 8中。如第一張圖所示,我們可以選擇實(shí)體機(jī)套件以及模擬器(Emulator)套件。對(duì)于沒有實(shí)體機(jī)的同行們來說只能選擇Emulator了。當(dāng)我們按照正常步驟,構(gòu)建,再運(yùn)行時(shí),會(huì)彈出Windows Phone虛擬機(jī),看起來一切正常:
???????? 但是這里有一個(gè)坑。過一會(huì)兒程序啟動(dòng)后會(huì)變得空白一片:
下面也會(huì)彈出
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.
這樣的紅字。后面了解到這個(gè)問題不影響的。只是我們?nèi)绾尾拍茱@示程序呢?
5、界面,你快回來
???????? “Qt for WinRT”這篇文章講到了,我們?cè)跍y(cè)試的時(shí)候,Qt會(huì)提供一個(gè)小工具,叫qtd3dservice。它可以即時(shí)地將著色器編譯并呈現(xiàn)給應(yīng)用程序。因?yàn)樽鳛橹С諵t渲染的OpenGL,在遇上微軟的手機(jī)后,不得不“改頭換面”,披著Direct3D的外衣來“見”Windows Phone 8手機(jī)。于是需要通過Google Code中一個(gè)項(xiàng)目ANGLE,將OpenGL ES2.0的著色器代碼轉(zhuǎn)換成D3D著色器。剛才無法顯示界面,原因是作為界面依賴的著色器沒有被載入。
???????? 解決方法也很簡單,在QtSDK的bin目錄下運(yùn)行不帶參數(shù)的qtd3dservice就行了。然后再打開我們編譯的程序:
這樣稍微好一點(diǎn)了,至少我們看到了界面,可是一大堆方塊又讓我們犯愁了。這又是一個(gè)坑那么如何才能讓我們看到文字呢?
6、文字,你快回來
???????? 看了看Qt 5.3.1for Windows Phone的目錄結(jié)構(gòu),一個(gè)顯著的不同是在bin和lib文件夾中都有一個(gè)名為“font”的目錄,這個(gè)目錄是存放與界面顯示相關(guān)的字體的。默認(rèn)打包的時(shí)候會(huì)包含這些字體。等等,我們剛剛就這樣運(yùn)行程序,可是沒有進(jìn)行打包啊。那么如何進(jìn)行打包呢?這還得靠我們剛剛安裝的VS14。首先定位$${YourProjectDirctory}中,打開命令提示符,輸入:
$${QTDIR}/5.3/winphone_x86/bin/qmake -tp vcYourProject.pro "CONFIG+=windeployqt"
我這里是這樣的:
?????? 運(yùn)行后,發(fā)現(xiàn)uuidgen找不到。這又是一個(gè)坑。開始我盡力地去尋找uuidgen.exe,甚至去網(wǎng)上下載了一個(gè)uuidgen.exe,并且放在了C:/Windows/system32中,結(jié)果都沒有起作用!所以說這又是一個(gè)坑。不過這個(gè)錯(cuò)誤并不影響這一步操作,一些必要的Qt和VS項(xiàng)目文件也能夠順利生成。
???????? 此時(shí)用VS14打開生成的vcxproj文件。如下所示:
此時(shí)點(diǎn)擊deploy,試試看。結(jié)果報(bào)錯(cuò)!
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坑人的地方了。因?yàn)闊o法生成ProductID,所以無法部署打包。
???????? 當(dāng)務(wù)之急就是能夠找到產(chǎn)生uuid的方法。這里有好幾種方法。
(1)??????VS中有一個(gè)叫g(shù)uidgen.exe的工具,和uuidgen只差一個(gè)字母。可以用它來產(chǎn)生uuid;
(2)??????去網(wǎng)上下載uuidgen.exe,那是1996年微軟的老物了,但在命令符下仍然能夠產(chǎn)生uuid;
(3)??????大家都有Chrome瀏覽器吧,教大家如何使用Chrome產(chǎn)生uuid。事實(shí)上任何js解釋器環(huán)境都可以,包括QML Engine。打開Chrome,Ctrl + Shift + J,打開JS控制臺(tái),然后輸入下面的JS代碼:
[javascript]?view plaincopy
回車,就能夠產(chǎn)生一個(gè)合法的uuid了。這里我產(chǎn)生的uuid是:
684cebbf-bb4a-857b-9a1e-746feb967cd3
我們需要做的是,進(jìn)入項(xiàng)目目錄,編輯WMAppManifest.xml,找到ProductID字段,將我們產(chǎn)生的uuid放在大括號(hào)里面,保存,這樣就好了。
???????? 然后進(jìn)入VS14,點(diǎn)擊deploy,然后Ctrl + F5全速運(yùn)行。記得在運(yùn)行之前運(yùn)行qtd3dservice。運(yùn)行結(jié)果如下所示:
???????? 大功告成!經(jīng)過兩天的嘗試和提問,我終于能夠在Windows Phone上面成功地運(yùn)行Qt程序了。有關(guān)Windows Phone上面更多開發(fā)方面的問題,有時(shí)間我會(huì)研究的。
7、總結(jié)
???????? 這里作一個(gè)小小的總結(jié):
1、? Windows Phone應(yīng)用安裝包的后綴是.xap文件,可以用7-zip等壓縮解壓工具打開,打開后發(fā)現(xiàn)和Android的apk安裝包的目錄結(jié)構(gòu)大同小異。
2、? 如上面介紹,用Qt開發(fā)WindowsPhone 8還存在很多坑,再比如說這個(gè)例子,想點(diǎn)擊左上角的File菜單,就不靈敏,有時(shí)候Exit選項(xiàng)會(huì)獨(dú)占整個(gè)屏幕,顯得這個(gè)屏幕很空;此外,一些重要的Qt模塊比如說我迫切需要的Enginio,并沒有一并移植過來。所以說開發(fā)Windows Phone 8應(yīng)用還是實(shí)驗(yàn)性的,希望在Qt 5.4中能夠做得更好。
3、? 如果不希望每次啟動(dòng)qtd3dservice在線編譯著色器,那么可以使用“qtd3dservice --list-binary --qrc --device 0 --app {684cebbf-bb4a-857b-9a1e-746feb967cd3}--output /path/to/project/shaders.qrc”來產(chǎn)生shader資源,然后再修改pro文件,添加這一行:“RESOURCES+= shaders.qrc”,最后重新編譯打包。
4、? 其實(shí)qtd3dservice只是一個(gè)初步可行的辦法,當(dāng)時(shí)考慮Windows的政策不允許JIT編譯。我在jira上看到Qt團(tuán)隊(duì)討論的結(jié)果是,qtd3dservice將在Qt5.4中移除。因?yàn)?#xff08;1)Windows 8.1支持設(shè)備在線(JIT)著色器的編譯;(2)qtd3dservice只是一個(gè)實(shí)驗(yàn)性的解決方案,以后不必維護(hù);(3)可以使用scene-graph采取的cache方法來應(yīng)用到著色器當(dāng)中。(參考這里)
5、? 即使使用了Hyper-V技術(shù),在模擬器上體驗(yàn)WindowsPhone 8的效果還是比不上真機(jī)。我曾經(jīng)在蘇寧電器城中使用諾基亞Lumia 525成功運(yùn)行Digia的Qt應(yīng)用Quick Forcast。有條件的話,還是買一臺(tái)真機(jī)進(jìn)行開發(fā)測(cè)試吧。
總結(jié)
以上是生活随笔為你收集整理的搭建Qt 5.3.1 for Windows Phone 8开发环境的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QML设计登陆界面
- 下一篇: 小众编程语言同样值得你关注