Qt on Android:圖文詳解Hello World全過程
轉(zhuǎn)載于:http://blog.csdn.net/foruok/article/details/23528293??
我將從實(shí)踐出發(fā),帶領(lǐng)大家一步一步完成在 Android 上的第一個(gè) Qt 應(yīng)用: Hello Qt on Android 。應(yīng)用本身非常簡(jiǎn)單(僅僅是在屏幕上顯示一個(gè)字符串 "Hello Qt on Android" ),這也是每種編程語言的入門教程中 Hello World 程序的共性。
? ? 下面我將和大家一起來探索使用 Qt Creator 3.0 創(chuàng)建、管理、編譯、部署 Qt on Android 應(yīng)用的整個(gè)過程。每一個(gè)步驟都配以我精心挑選并編排整理的截圖,力求初學(xué)者可以按圖索驥、順暢地走下去,完成自己在 Android 平臺(tái)上的第一次觀光旅行。
? ? 打開 Qt Creator ,點(diǎn)擊文 "件(F)" 菜單,在彈出的菜單列表中選擇 "新建文件或項(xiàng)目(N)" 。如下圖所示:
? ? 如上操作后, Qt Creator 會(huì)彈出新建工程界面,讓我們選擇工程模板。如下面的所示:
? ? 這里我們選擇 "應(yīng)用程序" 項(xiàng)目, "Qt Widgets Application" 模板??梢钥吹阶钣覀?cè)的實(shí)時(shí)提示,支持的平臺(tái)中有 Android(藍(lán)線所示),看到這點(diǎn),說明前面的開發(fā)環(huán)境搭建是正確的。
? ? 點(diǎn)擊 "選擇(C)..." 按鈕,新建工程向?qū)?huì)指引我們進(jìn)入下一環(huán)節(jié) "項(xiàng)目介紹和位置" 。參考下圖:
? ? 我已經(jīng)做了標(biāo)識(shí),編號(hào)為 1 的文本框,你可以填寫項(xiàng)目的名字,這里是 "HelloQtAndroid" ;編號(hào)為 2 的 "瀏覽..." 按鈕允許你選擇工程的存儲(chǔ)路徑,我準(zhǔn)備把工程放在 "D:projectsblogsqt" 目錄下面。請(qǐng)對(duì)照下圖檢查你的配置:
? ? 點(diǎn)擊 "下一步" 按鈕,跟隨向?qū)нM(jìn)入構(gòu)建套件選擇("Kit Selection")環(huán)節(jié)。
? ? 我選擇了兩個(gè)套件,"Android for armeabi (GCC 4.7, Qt 5.2.0)" 和 "Desktop Qt 5.2.0 MinGW 32bit",分別對(duì)應(yīng)下圖中的標(biāo)號(hào)為 1 和 2 的區(qū)域。請(qǐng)對(duì)照下圖檢查你的配置。
? ? 點(diǎn)擊 "下一步" 按鈕,跟隨向?qū)нM(jìn)入 "類信息" 配置環(huán)節(jié)。下圖是默認(rèn)的界面:
? ? 上圖中標(biāo)號(hào)為 1 的下拉框,可以選擇待創(chuàng)建的 Widget 的基類,默認(rèn)是 QMainWindow ,我這里選擇 QWidget。標(biāo)號(hào)為 2 的復(fù)選框,如果選中則會(huì)生成一個(gè) .ui 文件,可以通過 Qt SDK 中的界面設(shè)計(jì)師來編輯界面,為了簡(jiǎn)單直接,我們?nèi)サ袅诉x中,不使用 .ui 文件,全部使用代碼完成界面構(gòu)建。
? ? 請(qǐng)參考下圖檢查你的配置:
? ? 點(diǎn)擊 "下一步" 按鈕,跟隨向?qū)нM(jìn)入 "項(xiàng)目管理" 環(huán)節(jié)。在這里你可以選擇是否將工程加入版本控制系統(tǒng)(如 svn 之類),還可以看到即將添加到我們的 "Hello Qt on Android" 工程中的文件。如下圖所示:
? ? 終于看到 "完成(F)" 按鈕了,趕緊點(diǎn)擊它!看下圖,我們將進(jìn)入日后使用 Qt Creator 這個(gè)近乎完美的 IDE 編程時(shí)使用頻度最高、相依相伴時(shí)間最久的界面。
? ? 如上圖所示,這就是我們?nèi)蘸筇焯煲鎸?duì)、不斷打交道的界面。我會(huì)選擇幾個(gè)最常用的功能簡(jiǎn)明扼要的介紹它的用法。
? ? 左邊欄,標(biāo)號(hào)為 1 的標(biāo)簽,是 "編輯" 標(biāo)簽,選中它,會(huì)進(jìn)入編輯模式,就是上面的樣子。
? ? 標(biāo)號(hào)為 2 的標(biāo)簽,是 "項(xiàng)目" 標(biāo)簽,選中它,會(huì)打開項(xiàng)目選項(xiàng)配置界面。該界面功能豐富到有些繁雜,后面我們會(huì)多花些時(shí)間來一一介紹我們的 "Hello Qt on Android" 工程必須要用的選項(xiàng)。
? ? 標(biāo)號(hào)為 3 的是 "構(gòu)建版本" 按鈕, 點(diǎn)擊它,會(huì)彈出一個(gè)快捷界面,允許我們快速選擇不同構(gòu)建版本(如 Android 的 Release 構(gòu)建, Desktop 的 Debug 構(gòu)建等等)。點(diǎn)擊 "項(xiàng)目" 標(biāo)簽所進(jìn)入的配置界面中也可以完成構(gòu)建版本選擇。
? ? 標(biāo)號(hào)為 4 的是 "運(yùn)行" 按鈕,點(diǎn)擊它, Qt Creator 會(huì)執(zhí)行編譯、鏈接、打包等等工作,直到目標(biāo)程序運(yùn)行起來或者出錯(cuò)停止。
? ? "運(yùn)行" 按鈕下面依次是 "開始調(diào)試" 、 "構(gòu)建項(xiàng)目" 按鈕,鼠標(biāo)懸停在它們上面就可以看到提示,其用途不言自明。
? ? 標(biāo)號(hào)為 5 的那一橫排標(biāo)簽,是 Qt Creator 的輸出窗口,點(diǎn)擊任一標(biāo)簽,都會(huì)向上伸展出一個(gè)窗口顯示與標(biāo)簽名字對(duì)應(yīng)的信息。
? ? 問題標(biāo)簽對(duì)應(yīng)的窗口顯示構(gòu)建問題,找到問題后雙擊就會(huì)跳轉(zhuǎn)到對(duì)應(yīng)的代碼行或編譯輸出窗口(部分鏈接錯(cuò)誤)。
? ? 編譯輸出標(biāo)簽對(duì)應(yīng)的窗口會(huì)把編譯、鏈接、打包、部署過程中的信息都顯示出來,這是我們從外面觀察 Qt Creator 工作過程的極佳途徑,善加使用必將獲益良多。
? ? 應(yīng)用程序輸出標(biāo)簽對(duì)應(yīng)的窗口會(huì)顯示應(yīng)用程序使用標(biāo)準(zhǔn)輸出打印的信息,APK 運(yùn)行后, logcat 的日志也會(huì)顯示在這里。
? ? 其它標(biāo)簽不再細(xì)說,開發(fā)過程中使用幾次就熟悉了。
? ? 標(biāo)號(hào)為 6 的區(qū)域,就是代碼編輯區(qū)。
? ? 標(biāo)號(hào)為 7 的區(qū)域,是側(cè)邊欄、項(xiàng)目管理區(qū)域,這里允許開發(fā)者以項(xiàng)目、類視圖、大綱、文件系統(tǒng)、類型層次、打開文檔等等方式來管理項(xiàng)目。
? ? 介紹完了我們的好伙伴——項(xiàng)目管理與代碼編輯界面,接下來我們繼續(xù)完成 "Hello Qt on Android" 的項(xiàng)目配置。點(diǎn)擊前面介紹的標(biāo)號(hào)為 2 的項(xiàng)目標(biāo)簽,會(huì)看到下面的項(xiàng)目選項(xiàng)配置界面:
? ? 我們的新建工程,默認(rèn)選中了 "Desktop Qt 5.2.0 MinGW 32bit" 這個(gè)套件。請(qǐng)注意上圖左下藍(lán)線標(biāo)出的按鈕,前面提到,它是構(gòu)建版本選擇按鈕,現(xiàn)在顯示的是電腦圖標(biāo)配Debug字樣。
? ? 點(diǎn)擊標(biāo)號(hào)為 1 的區(qū)域中的構(gòu)建按鈕(藍(lán)色圓圈所在),切換到 "Android for armeabi" 套件,進(jìn)行構(gòu)建相關(guān)的配置。如下圖:
? ? 構(gòu)建配置選項(xiàng)繁多,對(duì)于我們的第一個(gè)應(yīng)用,只要關(guān)注途中標(biāo)識(shí)出的 1 和 2 兩個(gè)功能怎么使用即可。
? ? 標(biāo)號(hào)為 1 的按鈕,點(diǎn)擊可以切換到"運(yùn)行"選項(xiàng)配置,馬上就能看到。
? ? 標(biāo)號(hào)為 2 的組合框,可以選擇構(gòu)建版本(一般是 Debug / Release 兩個(gè))。它完成和左邊欄下藍(lán)色圓圈標(biāo)識(shí)的構(gòu)建版本按鈕一樣的功能。我們這里選擇 "Release" 構(gòu)建。
? ? 注意藍(lán)色圓圈標(biāo)識(shí)區(qū)域,隨著我們選中 "Android for armeabi" 套件和 "Release" 構(gòu)建,它從電腦圖標(biāo)變成了安卓小機(jī)器人配 "Release" 字樣的按鈕。
好啦,現(xiàn)在讓我們點(diǎn)擊標(biāo)號(hào)為 1 的"運(yùn)行"按鈕,進(jìn)行運(yùn)行選項(xiàng)配置。對(duì)目前這個(gè)項(xiàng)目來說,運(yùn)行配置遠(yuǎn)比構(gòu)建配置復(fù)雜,請(qǐng)擦亮眼睛,用心體會(huì)。
? ? 切換到運(yùn)行配置,界面如上圖所示。先來看部署配置,點(diǎn)擊圖中標(biāo)號(hào)為 1 的 "詳情" 按鈕,打開部署配置詳情界面:
? ? 希望你沒被嚇到,我在上圖中作了 9 處標(biāo)識(shí),比之前的編輯界面( 7 個(gè)標(biāo)識(shí))還多。讓我們化繁為簡(jiǎn),一個(gè)一個(gè)來看。
? ? 標(biāo)號(hào)為 1 的下拉框,可以選擇應(yīng)用針對(duì)的目標(biāo) SDK 版本,這里默認(rèn)是 android-17。我得說( 先請(qǐng)大神 BogDan Vatra 見諒 ) Qt Creator 的這種顯示不夠完美,如果鼠標(biāo)懸停在下拉框上時(shí)懸浮窗提示一下會(huì)更好。
? ? 我這里簡(jiǎn)要說明一下 Qt Creator 中的這個(gè)配置選項(xiàng)。實(shí)際上它對(duì)應(yīng) Android APK 的主配置文件 AndroidManifest.xml 中的 ?android:targetSdkVersion 配置項(xiàng)。這個(gè)配置項(xiàng)允許你指定你的應(yīng)用針對(duì)的Android API Level ,而吊詭的是,它使用 sdkVersion 來作為標(biāo)簽,容易引起混淆。實(shí)際上,現(xiàn)在我們可以簡(jiǎn)單地把 sdkVersion 和 API Level 理解為同一個(gè)東西,細(xì)微差別以后再說。
? ? 為了讓大家對(duì) Android API Level 有個(gè)概念,我截取了 Google Android 在線手冊(cè)(請(qǐng)?jiān)L問頁面" http://developer.android.com/guide/topics/manifest/uses-sdk-element.html" )中的一幅圖放在下面:
? ? 標(biāo)號(hào)為 2 的"對(duì)包簽名"復(fù)選框,選中時(shí) Qt Creator 會(huì)自動(dòng)對(duì) APK 進(jìn)行簽名。而一旦你選中了它,就需要提供一個(gè)密鑰文件( keystore )供 Qt Creator 使用。 如果沒有,則點(diǎn)擊標(biāo)號(hào)為 3 的 "Create" 按鈕, Qt Creator 會(huì)幫你創(chuàng)建一個(gè);如果有,可以點(diǎn)擊 "Browse" 選擇。
? ? 標(biāo)號(hào)為 4 的單選框,是 Qt 庫(kù)布署策略中的一個(gè),用 Ministro 服務(wù)安裝 Qt 。我們推薦使用這個(gè),具體原因會(huì)在" Qt 庫(kù)的部署策略"一節(jié)詳細(xì)介紹。另外一個(gè)可用的策略是把 Qt 庫(kù)打包到你的 APK 中。
? ? 標(biāo)號(hào)為 5 的復(fù)選框,選中時(shí) Qt Creator 會(huì)在打包完成后打開包所在的目錄,方便開發(fā)者訪問生成的 APK 。
? ? 標(biāo)號(hào)為 6 的浮現(xiàn)選,對(duì)應(yīng)日志輸出選項(xiàng)。
? ? 標(biāo)號(hào)為 7 的按鈕, "Create AndroidManifest.xml" ,如按鈕名所示,幫助你創(chuàng)建并配置 APK 的主配置文件 AndroidManifest.xml 。如果你不點(diǎn)這個(gè)按鈕呢, Qt Creator 會(huì)使用默認(rèn)的選項(xiàng)幫你創(chuàng)建一個(gè)默認(rèn)的配置文件。建議創(chuàng)建并配置它,否則你的 APK 包名什么的都會(huì)讓你覺得怪怪的有點(diǎn)不舒服。
? ? 標(biāo)號(hào)為 8 的按鈕,"Install Ministro from APK",則是 Qt Creator 提供給我們的一個(gè)貼心服務(wù),允許我們把下載到本地的 Ministro APK 安裝到 Android 設(shè)備上。順便說下,我在完成 "Hello Qt on Android" 項(xiàng)目時(shí)就遇到了無法安裝 Ministro 服務(wù)的問題,我的 XT882 電信定制版手機(jī),根本訪問不到 Google Play。?
? ? 標(biāo)號(hào)為 9 的區(qū)域有兩個(gè)按鈕,允許我們添加依賴庫(kù)?,F(xiàn)在的工程用不到,以后再說。
? ? 啊,天,終于說完了,你睡著了嘛,醒醒,我們繼續(xù)往下看。
? ? 讓我們回到簽名選項(xiàng)(別忘了,標(biāo)號(hào) 2 ),選中它,然后點(diǎn)擊標(biāo)號(hào)為 3 的 "Create" 按鈕,創(chuàng)建密鑰文件和證書。你會(huì)看到下面的界面(空空如也,沒錯(cuò),是初始界面嘛):
? ? 如上圖所示,有很多選項(xiàng),照著填寫就行,錯(cuò)了會(huì)有提示。我配置好后截了圖,在下面,請(qǐng)參照著檢查你的配置:
? ? 點(diǎn)擊"保存"按鈕,會(huì)彈出文件選擇對(duì)話框,讓你選擇密鑰文件的保存位置,你也可以修改它的名字。下面是我的配置截圖,供參考:
? ? 點(diǎn)擊——,哦,等下,先記住你剛才起的文件名和保存的位置(在市場(chǎng)中更新 APK 必須要使用和之前發(fā)布版本相同的簽名),后面還要用到,然后再點(diǎn)擊"保存"按鈕,我們會(huì)回到運(yùn)行配置界面。如下圖所示:
? ? 可以對(duì)照初始的運(yùn)行配置截圖,我把修改過的選項(xiàng)用藍(lán)色橫線標(biāo)注出來了。
? ? 接下來是我們的另一個(gè)重頭戲,創(chuàng)建 AndroidManifest.xml 文件。
? ?好啦,下面是創(chuàng)建向?qū)?,允許你選擇保存位置,先別動(dòng)它,使用默認(rèn)值(工程目錄下的 android 子文件夾,回頭你可以到這個(gè)位置觀光一下,AndroidManifest.xml 還有你應(yīng)用的圖標(biāo)都放在這里)就行。
? ? 直接點(diǎn)擊"完成(F)"按鈕,你會(huì)看到 Qt Creator 提供的供你編輯 AndroidManifest.xml 文件的圖形化界面(當(dāng)然你也可以在 Qt Creator 中查看 XML 并手動(dòng)修改它)。看圖:
? ? 這是個(gè)中等復(fù)雜度的界面,我做了 6 處標(biāo)識(shí),下面一一說明。
? ? 標(biāo)號(hào)為 1 的編輯框,填寫你的包名。如你所見,默認(rèn)值是 org.qtproject.example ,看起來不那么正式。
? ? 標(biāo)號(hào)為 2 的微調(diào)按鈕,允許你更改應(yīng)用的版本號(hào)。
? ? 標(biāo)號(hào)為 3 的區(qū)域,調(diào)整最低 API Level 和 目標(biāo) API Level。
? ? 標(biāo)號(hào)為 4 的區(qū)域,讓你設(shè)定你的 APK 圖標(biāo),有高、中、低三個(gè)尺寸(一般對(duì)應(yīng) 72x72 、 48x48 、 32x32)。
? ? 標(biāo)號(hào)為 5 的下拉組合框,列出了所有支持的權(quán)限,你可以考慮你的 APK 需要什么權(quán)限,選中它,點(diǎn)擊標(biāo)號(hào)為 6 的 "Add" 按鈕就可以在 AndroidManifest.xml 中添加一個(gè)權(quán)限。當(dāng)然你也可以點(diǎn)擊 "Remove" 按鈕來取笑一個(gè)不必要的權(quán)限。
? ? 關(guān)于 APK 的權(quán)限,這里不細(xì)說,會(huì)在"AndroidManifest.xml 介紹"一節(jié)中詳細(xì)說明。對(duì) HelloQtOnAndroid ,我保持 Qt Creator 設(shè)置的默認(rèn)權(quán)限。
? ? 下面是我的配置截圖,改動(dòng)的部分用藍(lán)線標(biāo)注出來了,請(qǐng)參照檢查你的配置:
? ? Qt Creator 提供的圖形化 Android Manifest 編輯界面,只支持了主要幾個(gè)選項(xiàng),如果你想細(xì)細(xì)調(diào)整體驗(yàn)掌控全局的感覺,請(qǐng)點(diǎn)擊上圖藍(lán)色方框處的"XML Source"按鈕,手動(dòng)編輯 xml 文件。如下圖所示:
? ? 和編輯 C++ 代碼一樣,可以在標(biāo)號(hào)為 1 的編輯區(qū)來編輯 XML 文件。
? ? 謝天謝地,一百里路我們走了九十里啦,接下來就會(huì)驚嚇、驚喜不斷。
? ? 雖然你已經(jīng)準(zhǔn)備好迎接驚喜,我們還是得按捺一下心情,把代碼稍稍修改幾行?;氐骄庉嫿缑妫_保你左側(cè)項(xiàng)目管理窗口選中"項(xiàng)目"方式,展開源文件夾,雙擊其下的 widget.cpp ,在右側(cè)編輯區(qū)添加一行代碼:
? ? 好了,看圖:
運(yùn)行程序
? ? 好啦好啦,九十九里路啦,咫尺之遙,請(qǐng)點(diǎn)擊左邊欄的"運(yùn)行"按鈕(你是否還記得), Qt Creator 會(huì)讓你選擇目標(biāo)設(shè)備(如果環(huán)境配置正確,連接了手機(jī)或者創(chuàng)建了AVD),建議直接真機(jī)運(yùn)行(你沒有 Android 手機(jī)嗎?),如下圖所示:
? ? 看見了嗎?選中我的老古董手機(jī),摩托羅拉 XT882 ,Android 版本是 2.3.6 ,點(diǎn)擊"確定"按鈕,活動(dòng)一下,靜待奇跡出現(xiàn)。
? ? 哦,嚇我一跳,我看見了這個(gè)界面:
? ? 忘了嗎,我們前面在運(yùn)行配置中勾選了"Open package location after build"選項(xiàng)。如果你要在市場(chǎng)中發(fā)布你的應(yīng)用,請(qǐng)注意選擇(圖中藍(lán)框所示)簽過名的版本。
? ? 等一下,現(xiàn)在該看手機(jī)了。我看到了這個(gè)界面:
? ? 你是否還記得,我們選擇的 Qt 庫(kù)布署策略——"使用Ministro 服務(wù)安裝 Qt 庫(kù)"?
? ? 現(xiàn)在要操作手機(jī),摸下"確定"按鈕,會(huì)嘗試安裝 Ministro 服務(wù)。驚嚇來了,我看到手機(jī)屏幕上華麗麗地閃過一個(gè) Toast 提示“安裝 Ministro 失敗”,然后就是下面的圖:
? ? 看樣子它是到我手機(jī)上默認(rèn)的安智市場(chǎng)中去找 Ministro 了,沒找到。按返回鍵吧,哦,天,停在了黑屏界面,沒有任何反應(yīng)……好吧,請(qǐng)猛擊手機(jī)的返回鍵或者小房子(主頁)鍵。哦,桌面出來了,謝謝。至于為什么 Ministro 安裝失敗會(huì)出現(xiàn)黑屏,請(qǐng)閱讀后續(xù)章節(jié)。
? ? 現(xiàn)在我們需要回頭來調(diào)整運(yùn)行配置,換一個(gè) Qt 庫(kù)布署策略——"在 APK 中捆綁 Qt 庫(kù)"。
? ? 再次運(yùn)行,再次看到 "package location" 文件夾界面……,好吧,看手機(jī),驚喜終于來了:
? ? 現(xiàn)在,終于可以停下來喘口氣了,我們的第一個(gè) Qt on Android 的應(yīng)用 "HelloQtOnAndroid"終于在真機(jī)上跑起來了。
? ? 如果你是第一次使用 Qt on Android,跟隨我的指南走下來,是什么感覺?反正我第一次把 "Hello Qt On Android " 跑通時(shí),還是非常振奮的,激動(dòng)了大半天。畢竟, Qt 作為在移動(dòng)互聯(lián)網(wǎng)時(shí)代,是唯一可以與 Android 、 iOS 并提的跨平臺(tái)應(yīng)用開發(fā)框架……;畢竟,作為 C/C++ 程序猿,我們可以為 Windows 桌面、 Linux 桌面 、 Android 手機(jī)/平板、iOS、MAC OS X 、 Tizen 、 Meego 、 Windows Mobile 、 Embedded Linux 、 Symbian等等平臺(tái)開發(fā)軟件而不需要切換開發(fā)框架和工具,是多么令人舒心、自豪的事兒;畢竟……
? ? 好了,第一次 Qt on Android 應(yīng)用的旅程到此為此。敬請(qǐng)期待后續(xù)文章。