內容簡介
《Qt on Android 核心編程》以“從零開始也能學會Qt on Android開發”為目標,基於最新的Qt SDK 5.2,從Qt基本機制講起,幫助讀者建立Qt開發的概念;介紹信號與槽、各種GUI控制項、布局管理器等各種Qt基礎主題,同時輔以簡潔有效有針對性的實例程式;有了使用Qt開發的基礎後,作者進一步將重點轉移到安卓平台,詳細介紹Qt on Android的開發環境搭建、APK部署、APK調試等基礎性的主題,然後深入講解Qt on Android是如何在Java的世界中發生的,最後著重講述Qt on Android的各種針對移動開發的技術主題,控制項、布局、檔案處理、XML、網路、多執行緒、按鍵、觸摸、感應器、多媒體,為讀者順利在Android(安卓)平台開發提供深入淺出的指南。
《Qt on Android 核心編程》首先是一本介紹Qt程式設計技術的書籍,其次是講述如何在移動平台Android上使用Qt框架進行開發的書籍。對於Qt技術感興趣的讀者,無論是專注於傳統的桌面軟體開發,還是希望嘗試使用Qt在Android平台開發,都可以從《Qt on Android 核心編程》中獲得最根本、最重要的知識與實例。《Qt on Android 核心編程》既適合有一定C/C++語言基礎、希望開發跨平台套用的開發人員,又適合希望開發安卓套用的C/C++開發人員,以及想了解Qt開發的人員。
編輯推薦
當Qt跨界牽手Android,移動開發會有什麼不同?初學者如何藉助Qt開發Android套用?跟隨CSDN博文大賽冠軍foruok進入Qt on Android無秘之旅!
內容提要
《Qt on Android 核心編程》以“從零開始也能學會Qt on Android開發”為目標,基於最新的Qt SDK 5.2,從Qt基本機制講起,幫助讀者建立Qt開發的概念;介紹信號與槽、各種GUI控制項、布局管理器等各種Qt基礎主題,同時輔以簡潔有效有針對性的實例程式;有了使用Qt開發的基礎後,作者進一步將重點轉移到安卓平台,詳細介紹Qt on Android的開發環境搭建、APK部署、APK調試等基礎性的主題,然後深入講解Qt on Android是如何在Java的世界中發生的,最後著重講述Qt on Android的各種針對移動開發的技術主題,控制項、布局、檔案處理、XML、網路、多執行緒、按鍵、觸摸、感應器、多媒體,為讀者順利在Android(安卓)平台開發提供深入淺出的指南。
《Qt on Android 核心編程》首先是一本介紹Qt程式設計技術的書籍,其次是講述如何在移動平台Android上使用Qt框架進行開發的書籍。對於Qt技術感興趣的讀者,無論是專注於傳統的桌面軟體開發,還是希望嘗試使用Qt在Android平台開發,都可以從《Qt on Android 核心編程》中獲得最根本、最重要的知識與實例。《Qt on Android 核心編程》既適合有一定C/C++語言基礎、希望開發跨平台套用的開發人員,又適合希望開發安卓套用的C/C++開發人員,以及想了解Qt開發的人員。
目錄
第1章 Qt概覽 1
歡迎來到Qt的世界,讓我們看看Qt是什麼,能給我們帶來什麼,又有誰在使用Qt。我們要約會的Qt on Android,它緣起何處,有著怎樣曲折婉轉的歷史,如今的小模樣能否讓我們愛之如狂……
1.1 什麼是Qt 1
1.2 我們能用Qt做什麼 1
1.3 誰在使用Qt 1
1.4 什麼是Qt on Android 2
1.5 Qt on Android的前世今生 2
第2章 Qt開發環境快速上手 6
當你遇見了合適的人,開始籌劃第一次約會,又是興奮又是惆悵,要不要買花,去哪裡買禮物,穿什麼衣服,灑什麼香水,帶什麼應對意外的小物件,該不該了解可能要去的地方環境如何……一切都為了順利地完成這事關緊要的第一次。我精心準備了Qt入門的一切,微笑著歡迎你的來訪。
2.1 Qt Creator簡介 6
2.2 Qt Creator下載與安裝 7
2.2.1 下載 7
2.2.2 安裝 7
2.3 創建第一個項目:Hello World 9
2.4 Qt Creator集成開發環境介紹 13
2.4.1 歡迎界面 13
2.4.2 編輯界面 16
2.4.3 調試界面 17
2.4.4 項目選項設定 18
2.4.5 選單簡介 19
2.4.6 Qt Creator的選項配置 21
2.4.7 項目模板介紹 22
2.5 Qt開發工具介紹 25
2.5.1 Assistant 25
2.5.2 Designer 29
2.5.3 Linguist 30
2.5.4 命令行環境 30
第3章 Qt on Android快速上手 32
風,起於青萍之末,升降於雲際本土,志高遠而固磐。Qt跨界牽手Android,帶給我們一種新的可能與希冀,這種欣欣然還需落到實處,從準備環境開始,從第一聲Hello開始,學會必要的調試手段,向著部署向著發布而去……
3.1 開發環境搭建 32
3.1.1 JDK安裝 32
3.1.2 環境變數設定 34
3.1.3 Android SDK安裝 36
3.1.4 Android NDK安裝 41
3.1.5 Apache Ant安裝 41
3.1.6 Qt Creator的Android環境配置 42
3.1.7 AVD創建 44
3.1.8 連線你的手機 46
3.2 Hello Qt on Android 47
3.2.1 創建項目 47
3.2.2 項目選項 50
3.2.3 創建密鑰檔案和證書 53
3.2.4 創建AndroidManifest.xml 55
3.2.5 添加代碼 53
3.2.6 運行程式 55
3.3 Qt庫的部署策略 57
3.3.1 Use Ministro service to install Qt 58
3.3.2 Bundle Qt libs in APK 59
3.3.3 Deploy local Qt libraries to temporary directory 60
3.4 日誌 62
3.4.1 為什麼要有日誌 63
3.4.2 在Qt中如何使用日誌 63
3.4.3 如何把日誌輸出到Android日誌系統中 64
第4章 Qt項目檔案介紹 67
有些頂頂重要的,卻總被忽視,pro檔案就是那個悲催的備胎啊,滿含深情一路追隨著你,你卻只在受傷時想起它值得珍惜。噢,沒關係,你看我十八般武藝萬種風情,只默默地在你身邊佇立,期待著你書到用時回眸一笑。
4.1 pro檔案介紹 67
4.1.1 注釋 68
4.1.2 組件選擇 68
4.1.3 目標檔案名稱 68
4.1.4 模板 69
4.1.5 指定源檔案 69
4.1.6 指定頭檔案 70
4.1.7 設定頭檔案路徑 70
4.1.8 指定庫與庫檔案路徑 70
4.1.9 定義宏 70
4.1.10 配置信息 71
4.1.11 代碼塊與條件測試 72
4.1.12 變數 74
4.2 pro.user檔案 75
4.3 pri檔案 75
4.4 Makefile 75
第5章 Qt入門 76
我們扔掉了紙尿褲,走出了Qt的第一步,興奮地揮舞著小手顛顛兒著跑起來了,身邊那些花兒,招呼一聲吧。你好,QWidget;你好,QLabel;你好,QPushButton;你好,親的信號與槽;你好,布局管理器……你看,它們回應你了,仿佛在說,你若安好,便是晴天。
5.1 Hello World再分析 76
5.2 QuitApp:帶互動的小程式 77
5.3 初識信號與槽 79
5.4 構建複雜界面 80
5.4.1 蓋洛普Q12測評程式 80
5.4.2 創建自己的槽 85
5.4.3 布局管理器介紹 85
5.4.4 控制項回顧 88
5.5 追隨Qt的代碼風格 91
第6章 元對象系統 92
Qt的根基就在元對象系統,唯有修好內功,各種招式方可如臂使指,信手拈來。就讓我們抽絲剝繭,以無刃入有間,看看signals、slots、emit、SLOT、SIGNAL這些Qt的繁花,就讓我們跟著moc走上一遭,就讓我們看看信號如何喚起阿槽,就讓我們練練事件與過濾器的絕招……
6.1 牡丹花示例 93
6.2 再論編譯過程 95
6.3 Q_OBJECT宏 96
6.4 QMetaObject 97
6.5 關鍵字signals、slots、emit、SIGNALS、SLOTS 97
6.5.1 signals 97
6.5.2 emit 98
6.5.3 slots 98
6.5.4 SIGNALS 98
6.5.5 SLOTS 98
6.6 moc的魔法 99
6.6.1 moc_peony.cpp的源碼 99
6.6.2 moc的工作清單 101
6.6.3 信號的真容 101
6.6.4 信號與槽的約會 102
6.7 深入理解信號與槽 107
6.7.1 信號與槽原理 107
6.7.2 如何使用信號與槽 108
6.7.3 信號與槽的連線類型 109
6.7.4 信號與槽經驗談 110
6.7.5 跨執行緒使用信號與槽 110
6.8 屬性系統 114
6.8.1 靜態屬性 114
6.8.2 動態(運行時)屬性 117
6.9 事件和事件過濾器 118
6.9.1 重寫event() 119
6.9.2 重寫特定事件處理器 120
6.9.3 事件過濾器 120
6.9.4 自定義事件 122
6.10 定時器事件 124
6.10.1 使用QTimer 125
6.10.2 使用QObject::startTimer 125
6.11 對象樹與生命周期 126
6.12 智慧型指針 131
6.12.1 QPointer 131
6.12.2 QSharedPointer 132
6.12.3 QWeakPointer 133
6.12.4 QScopedPointer 134
6.12.5 QObjectCleanupHandler 135
6.13 動態類型轉換 136
6.14 國際化 136
6.14.1 字元串國際化方法 137
6.14.2 創建譯本 138
6.14.3 裝載譯文檔案 138
6.14.4 運行時改變語言 138
第7章 Qt模板庫介紹 140
你離不開的,不只有空氣、網路、微信、智慧型手機,還有接納千言萬語的QString,還有環環相扣的QList,還有你儂我儂的QMap,以及那些胸有千千壑可容萬萬對象的容器們。
7.1 使用QString 140
7.1.1 初始化一個字元串 141
7.1.2 操作字元串數據 141
7.1.3 字元串查詢 142
7.1.4 編碼轉換 142
7.1.5 格式化輸出 143
7.2 容器類 143
7.2.1 QList示例 144
7.2.2 QMap示例 146
第8章 Qt GUI編程 148
阿里巴巴進入了四十大盜的山洞,裡面都有什麼寶貝呢?單選按鈕複選框,行編輯與分組框,列表和表格,文本框攜手選項卡……你總是說,我要更多還要更美,QPainter會給你畫筆,給你顏色,給你想不到的美好。
8.1 智慧型手機GUI特點 148
8.2 內建視窗控制項介紹 149
8.2.1 QRadioButton 149
8.2.2 QCheckBox 150
8.2.3 QGroupBox 150
8.2.4 QLineEdit 152
8.2.5 QTextEdit 153
8.2.6 QTabWidget 154
8.2.7 QListWidget 155
8.2.8 Qt資源檔案系統 158
8.2.9 QTableWidget 160
8.3 自定義視窗部件 166
8.3.1 使用QPainter繪圖 166
8.3.2 為Android實現的ImageButton 167
8.3.3 文字漸變標籤 169
第9章 多執行緒 174
上路吧,執行緒,請引領我們進入並行世界,那騎著腳踏車看夕陽的時代已只堪懷念。低階的QThread賜予我們強大的控制力,它的事件循環會開啟潘多拉的盒子,跨執行緒的通信如此美麗。QThreadPool省卻了我們繁重的手工,而QtConcurrent則在高屋建瓴,勢必讓我們使用並發不費吹灰之力。
9.1 上路吧,執行緒 174
9.2 執行緒自己的事件循環 176
9.3 豈能老死不相往來——執行緒間通信 177
9.3.1 跨執行緒的信號與槽 177
9.3.2 跨執行緒的事件 178
9.3.3 門鈴示例程式 178
9.4 執行緒同步 182
9.5 使用QThread的注意事項 184
9.6 QThreadPool 184
9.7 高階多執行緒API:QtConcurrent 185
第10章 網路編程 189
網際網路的蓬勃發展從1995年開始,距今已有將近20年。2008年6月,iPhone 3G發布,開啟移動網際網路新紀元,距今已有7年。網路已經成為我們感知世界的重要神經元。在Qt的世界裡,QNetworkAccessManager讓網路連線與訪問變得一致而簡單,而QTcpSocket與QUdpSocket則為你掃清了socket的紛繁複雜,讓你可以優雅地打造你的專屬服務。
10.1 QNetworkAccessManager 189
10.1.1 http編程 190
10.1.2 ftp編程 198
10.2 QTcpSocket/QTcpServer 201
10.2.1 伺服器 203
10.2.2 客戶端 205
10.3 QUdpSocket 207
10.3.1 伺服器 207
10.3.2 客戶端 209
第11章 檔案IO 211
我想要有個家,一個不需要華麗的地方,在我疲倦的時候我會想到它。在計算機的虛擬世界,那些在記憶體中運行的套用軟體,它們有一個不變的根,就是檔案。原始的檔案操作艱澀難懂,而Qt提供的QFile、QTextStream、QDataStream這IO三劍客,化複雜為簡單優雅。
11.1 QFile 211
11.2 QTextStream 214
11.3 QDataStream 215
第12章 XML 217
1998年2月,XML標準正式出爐,從此我們可以用它對文檔和數據進行結構化處理,各種檔案格式方言魚龍混雜浮雲蔽日的時代漸行漸遠。多么美好的時代,Qt提供了DOM、SAX、StAX三種常見的XML處理模式,熱情地支持我們說同一種語言。
12.1 XML讀取與解析 217
12.1.1 DOM 218
12.1.2 SAX 219
12.1.3 StAX 223
12.2 XML文檔生成與保存 226
12.2.1 QXmlStreamWriter 226
12.2.2 QDomNode::save() 227
12.2.3 瘋狂原始人的方式 228
第13章 Qt on Android揭秘 229
也許你已經尋尋覓覓尋不到,Qt on Android的訊息。其實我一直在燈火闌珊處等你,現在就讓我們點燃火把,做一回武陵捕魚人,去尋桃花源。我們不僅要親歷Qt on Android套用的誕生過程,還要陪著它穿越JNI的逼仄入口,來到豁然開朗、美池桑竹各有其屬的Qt王國。
13.1 APK是怎樣煉成的 229
13.1.1 當你“運行”時 230
13.1.2 Android項目目錄結構 232
13.1.3 string.xml介紹 233
13.1.4 AndroidManifest.xml介紹 233
13.1.5 libs.xml介紹 238
13.1.6 Androiddeployqt.exe都幹了什麼 239
13.2 Java與Qt的結合過程 242
13.2.1 套用入口 242
13.2.2 通信代理 245
13.2.3 QPA外掛程式 248
13.3 Qt套用的狀態 252
第14章 Android移動開發主題 253
江湖之遠,廟堂之高,各有其運行規則。移動開發這片新天地,讓我們不得不重新審視自己:怎么處理BACK鍵,如何回應纖纖玉指多情的觸摸,怎樣在感測器的迷宮中穿梭,面對拍照的需求能否回響,在水一方的伊人想玉笛暗飛聲我們要不要十二萬分熱情地支持……
14.1 按鍵處理 253
14.1.1 重寫keyPressEvent/keyReleaseEvent 254
14.1.2 給子控制項安裝事件過濾器 255
14.1.3 套用級別的事件過濾器 256
14.2 觸摸與手勢 258
14.2.1 觸摸 258
14.2.2 手勢 263
14.3 感測器與手勢 264
14.3.1 常見感測器介紹 264
14.3.2 Qt感測器手勢類庫介紹 268
14.3.3 搖動手勢 268
14.3.4 覆蓋手勢 269
14.3.5 自由落體 269
14.3.6 纏繞手勢 269
14.3.7 翻轉手勢 269
14.3.8 扇動手勢 270
14.3.9 感測器手勢的使用 270
14.4 拍照 271
14.4.1 QCamera和它的小夥伴 271
14.4.2 QCameraViewFinder 273
14.4.3 QCameraImageCapture 273
14.4.4 使用相機拍照 274
14.4.5 在QML套用中使用相機 277
14.5 錄音與回放 278
14.5.1 錄音類庫 278
14.5.2 播放類庫 279
14.5.3 錄音與回放小示例 279
第15章 使用JNI擴展你的套用 286
Qt強則強矣,雅則雅矣,畢竟也有力不能及之時,所謂天長地久有時盡,不應有恨月常圓。Qt為Android準備了QAndoidJniObject和QAndroidJniEnviroment兩枚神器,藉助它們,你就可以提升你的念力,請來Android平台的諸位神仙樣人物幫你完成看似不可能的任務。
15.1 使用JNI Environment 286
15.2 調用Java代碼 287
15.2.1 Java方法簽名 288
15.2.2 調用Java方法 289
15.2.3 extendsQtWithJava實例 291
15.2.4 QtAndroid名字空間 298
15.2.5 使用手機外部存儲 298
15.3 Java調用C++ 299
第16章 紙上得來終覺淺,絕知此事要躬行 305
歷15章之漫長,終於可以攜劍下天山,就讓我們紅塵作伴,活得瀟瀟灑灑,策馬奔騰,共享人世繁華。音樂,圖片,筆記,拍照與美圖,天氣,查IP剖Json,這些,所有這些套用的出生與成長,我們將共同經歷,一路上有你,苦一點也願意……
16.1 筆記qnotepad 306
16.1.1 首頁設計與實現 308
16.1.2 筆記對象 316
16.1.3 筆記瀏覽與編輯 318
16.2 圖片瀏覽器 324
16.2.1 檔案選擇控制項 324
16.2.2 圖片載入器 335
16.2.3 圖片顯示 344
16.3 IP位址查詢 351
16.3.1 Json數據格式簡介 352
16.3.2 Qt中的Json類庫 352
16.3.3 程式詳解 353
16.4 音樂播放器 358
16.4.1 雲想衣裳花想容——Qt樣式表 359
16.4.2 多媒體類庫介紹 361
16.4.3 音樂播放器詳解 362
16.5 天氣預報 380
16.5.1 雲中誰寄錦書來——GPS定位 382
16.5.2 天氣查詢與顯示 387
16.6 拍照與後期處理 396
16.6.1 方寸天地納繾綣,楚楚蘊秀薄紙間 398
16.6.2 圖像處理算法 401
16.6.3 圖片載入與顯示 410
16.6.4 組織部長 413
附錄A 常見問題 420
參考文獻 427
前言
為什麼寫作本書
2008年,我開始在CSDN網站寫技術部落格。在此之前,我的理想是寫出受人待見的小說來,我也曾經在網路論壇上筆耕不輟獲得一些成績,也曾經發表過一些散文以及小說。而那一年,當我再次拾起筆來寫東西時,卻選擇了技術。這個世界上,唯一不變的就是變化,隨性如我,什麼都能接受,理解不了就接受,不想接受的也接受,目標達不成也可以接受,於是技術部落格寫了幾個月不想寫了,也說服自己接受了,看起來什麼都無所謂的樣子,不過我並不喜歡楊坤的《無所謂》這首歌。
2013年接近年底的時候,我決定重新開始撰寫技術部落格。這次是經過了理性的思考,而不是2008年那時的一時興起率性而為。
2013年的時候,我感到自己的腦容量開始變小,從前做項目時用到的很多技術慢慢地隨風遠去,終於漸行漸遠漸無書,費盡思量也難以述說了。難道是疊代周期變短了嗎?難道是我這台機器開始老化了嗎?這個時候我能夠回憶的,僅僅是當初學習某項技術時曾經遇到過挫折困頓彷徨猶豫,曾經輾轉反側寤寐思服,再無其他,我不想這樣:年老時蹲在門檻上,唯一可以回憶的,就是年輕時曾經掌握了8種語言,開發過100款軟體,回顧我的技術之路,就卡在“想當年……”這一句上。
正如卡夫卡說過的那句“任何障礙都可以粉碎我”一樣,某些簡單的問題總能把人絆倒,資深的技術人員總不能理解為什麼會這樣。其實他忘了自己曾經走過同樣的路,羅素說的對,參差多態乃幸福本源,但我們都太善於以己度人、以己繩人了。
學習過程的艱辛,日積月累的漸悟或剎那之間的醍醐,隨著歲月的流逝,終會成為遙遠而模糊的回憶;而你當初大惑不解屢次跌倒的坑窪,學成之後看起來是那么“不可思議”,以至於你忘了曾經這樣走過,不能理解別人為何總在一個地方犯錯。的確,誰會在一再跌倒的地方做上記號,永誌不忘?誰會把推敲再三的心得分門別類整理成文,開源給後學者以使其免蹈覆轍?事實上我從未想主動忘記自己半路出家初學編程的痛苦,但子在川上曰,逝者如斯夫,淡忘總在發生,而我們依舊前行,如果不予以記錄,歲月的風霜雪雨終將掩埋你曾走過的路。所以,寫文章這件事,更多是為了自己,記下亦是放下,卻又可在想用之時根據記下的隨時喚醒沉睡的經驗記憶,對別人或又能解其困惑,利己利人之事,何樂不為?
所以我決定重新開始技術部落格的更新之旅,既可以識別自己的學習模式,固化已有的經驗,形成系統的知識體系,又可以溫故知新,增益知識的廣度和厚度。而本書的寫作正是緣起於我部落格上的文章,不能不說是一次意外之喜。我願意在有限的時間內不計代價地完成本書,這是我個人的興趣所在。一個人總應該在某個時候有某件事,讓你全力以赴地去完成,不計成敗,不想得失,你所有的動力,就僅僅是你喜歡,你情願把它做好。
致謝
第一個要感謝的,是發現我的編輯高洪霞老師,沒有她,我很難有途徑尋找這么一個機會回顧自己也惠及他人。在我的寫作過程中,高老師給了我許多關切、鼓勵和具體的建議,對於本書的完成具有至關重要的意義。
我要特別感謝本書的文字編輯鞏櫻老師,她和本書初稿中的代碼、文本格式、筆誤、錯漏等進行了艱苦的鬥爭,取得了巨大的成果。
還要感謝出版社及為本書付出辛勤勞動的其他編輯,沒有你們的辛苦付出和鼎力幫助,本書絕難順利付梓出版。
接下來要感謝的,是我的老婆趙建媛女士,儘管她擔心本書可能不會大賣,擔心我天天熬夜的辛苦可能白費,她還是毫不猶豫地支持我,在精神上和行動上都給予了我強有力的鼓勵和幫助。寫作本書期間,我心心念念只有書稿,對其他事情要么渾渾噩噩要么簡單粗暴,給她帶來了很多精神上的困擾和實際生活上的壓力,但她依然微笑著陪我前行。沒有老婆的支持,實在難以想像我可以一個人完成一部書這樣一項浩大的工程。
另外還要感謝我美麗可愛的女兒安悅瑄小朋友,四歲多的她還不明白寫書是什麼概念,但她還是很自豪地向她的小夥伴們宣告說她的爸爸正在寫書。能夠做一件讓女兒感到爸爸很棒的事情,我覺得非常開心。寫書這段時間我很少陪女兒玩耍,對此我深感不安,在這裡向她說一句,親親我的寶貝,爸爸馬上出關了。
特別鳴謝:上海Qt開發聯盟的群友們給了我很多鼓勵和支持,在與他們的交流中頻受啟發獲益良多。
必須感謝所有在我寫作期間對我噓寒問暖、給予我幫助的朋友們,是你們讓我覺得世界如此溫暖。
最後,也最應該感謝的,是肯花費時間和精力閱讀本書的讀者,你們的意見和建議,我會視若珍寶。
這本書適合誰
本書首先是一本介紹Qt程式設計技術的書籍,其次是講述如何在移動平台Android上使用Qt框架進行開發的書籍。對於Qt技術感興趣的讀者,無論是專注於傳統的桌面軟體開發,還是希望嘗試使用Qt在Android平台開發,都可以從本書中獲得最根本、最重要的知識與實例。
如果你剛接觸Qt,希望能快速入門,本書第2章提供了圖文並茂的環境搭建教程、簡潔實用的Qt Creator集成開發環境介紹、各種開發工具的快速使用指南以及詳細到令人咋舌的入門項目創建過程。同時,筆者也在第5章進一步介紹了Qt的布局管理器,在第8章扼要講述了可以在桌面和Android兩個平台上同時使用的Qt Gui控制項,這些可以作為基礎教程。
如果你已經使用Qt開發過桌面軟體或者嵌入式軟體,現在想在Android平台上小試牛刀,那就趕快行動吧。本書以“從零開始也能學會Qt on Android開發”為目標,在第3章首先詳細講述JDK、Android SDK、Android NDK、環境變數設定、安卓虛擬設備創建、手機連線等一切可能給你入門帶來障礙的內容,然後以Hello Qt On Android為基礎,不厭其細地講述如何創建支持Android平台的項目、如何配置Android相關的項目選項、如何部署Qt on Android套用,力求使你覺得“原來一切這么簡單啊”,最後又介紹如何在Android上使用Qt及Android的日誌系統、如何使用adb過濾套用日誌,以備你在開發過程中遇到問題時不再為調試問題發愁。在第13章,筆者深入Qt on Android內部,一步一步為你揭開Qt何以能夠在Android平台運行的秘密,讓你做個明白人。當然,如果你對此不感興趣,可以跳到第14章開始看,那裡有移動開發的各種主題。第15章是筆者為你準備的進階利器,以便你需要呼叫Android系統為你的套用助拳時有路可循。至於第16章,則是本書所介紹內容在Android平台的大閱兵,你不但會看到Qt傳統的各種技術(如網路、XML、Qt Widgets、檔案IO、Json、QTL、事件過濾器等)如何在Android平台上躍馬揚鞭,也會看到感測器、錄音、多點觸控等移動開發技術的實際套用,還會看到JNI的實作,產生原來我不是一個人在戰鬥的感覺。
如果你對Qt的信號與槽念茲在茲,想知其然而後知其所以然,本書能夠充分滿足你的需要。筆者始終認為,信號與槽是Qt框架最有特色的內容,是一切Qt重要技術的基石,因此筆者在第5章和第6章先後多次從不同角度進行了講述,既涵蓋了信號與槽的各種典型使用場景,也抽絲剝繭剖析了信號與槽的原理,甚至不厭其煩花大量篇幅講述了Qt元對象系統,為的就是讓你從“大概知道怎么用”的階段提升到“瞭然為什麼這么用”的境界。
很多開發者在實際的項目開發中經常使用多執行緒,我曾經在網路上看到太多的人對Qt多執行緒編程感到迷惑,提出了各種各樣的問題,尤其是當信號與槽遭遇多執行緒,不得不說的故事就數不勝數了,難免讓人感嘆不幸的問題各有其不幸。而本書的第6章、第9章可以帶領你走出泥淖。
好吧,如果你對Qt的網路編程(第10章)、Qt模版庫如何使用(第7章)、Qt的XML技術(第12章)感興趣,本書也不會讓你失望。
喔?你希望介入Qt的事件處理流程?沒問題,第6章的第9節就是為你準備的,看了它你就可以掌握Qt事件處理的七種武器,想攔誰就攔誰,為所欲為。
你需要什麼技術基礎
Qt是基於C++的開發框架,大量使用面向對象概念,諸如繼承、虛函式、重載、純虛類等,如果你從未接觸過C++,筆者還是建議你先了解C++和面向對象編程,否則本書可能會打擊你學習新技術的信心。如果你已接觸過C++但不是十分熟悉,沒關係,遇到不明之處翻閱C++書籍即可,我想這應該不會影響對本書內容的理解。
如果你有C++基礎但從未接觸過GUI編程,不要擔心,Qt雖然是基於事件機制的,但它良好的封裝使得你可以從Qt開始你的第一個GUI套用。
如果你想在Qt中通過調用Java代碼來獲得使用Android系統功能的特權,那你可能需要一點Java語言和Android編程的基礎。不過沒有也沒關係,如果你熟悉C++,學習並掌握Java語言的基礎部分是十分容易之事,而Android套用開發的很多概念和模式又和Qt相通……
你需要什麼軟硬體環境
筆者使用Windows 7作為開發環境,可供參考。
至於開發主機的硬體配置,筆者建議配置為:
雙核以上CPU
4GB以上記憶體
而為了驗證Qt on Android套用在手機上的效果,還需要一部Android手機,系統版本在2.3以上。建議配置為:
Android系統4.0及以上
記憶體1GB以上
4GB以上快閃記憶體或加配SD卡
為了連線電腦和手機進行安裝與調試,需要:
一根與手機匹配的數據線
與手機匹配的ADB驅動
本書術語表
作者在寫作本書的過程中,不可避免地引用了部分英文術語以及縮寫,為不引起歧義,有必要把它們界定一下。
IDE:Integrated Development Environment,集成開發環境,如Qt Creator,Visual Studio等。
GUI:Graphical User Interface,指採用圖形方式顯示的計算機操作用戶界面。筆者行文過程中有時使用其簡寫GUI,有時以圖形用戶界面指代,有時我也用UI替代GUI。
Application Framework:你可以理解為它是一個擁有諸多套用開發所需的基本功能(如程式模型、網路、XML、GUI組件等)的類庫,開發人員只要從其中擷取符合自己需求的模組,就可以像搭積木一樣完成自己的套用。我在書中有時稱其為套用框架、套用開發框架,視上下文環境而定。
API:Application Programming Interface。系統或套用框架開放出來,給程式設計師使用的接口,就是API。它可以是C函式那樣的東西,也可以是C++類,還可以是信號……
Android:一種基於Linux的自由及開放原始碼的作業系統,主要使用於移動設備,如智慧型手機和平板電腦,由Google公司和開放手機聯盟領導及開發。比較常用的中文對應詞是安卓和安致。本文多數時候直接使用Android一詞,有時使用安卓,有時還以Android指代開發它的公司和組織,視上下文而定。
SDK:Software Development Kit,軟體開發工具包。廣義上指輔助開發某一類軟體的相關文檔、源碼、範例和工具的集合,比如Qt SDK,Android SDK……
NDK:Native Development Kit,本書專指Android NDK,與SDK類似,它是Android提供的一系列工具、文檔、源碼、範例的合集,幫助開發者快速開發C/C++的動態庫,並能自動將so和Java套用一起打包成APK。
APK:Android Package,即Android安裝包。APK檔案其實是.zip格式,但後綴名被修改為apk,它包括編譯過的Java代碼、配置檔案、圖片、字元串等資源,你可以認為它是與Windows下的msi、Red Hat Linux的rpm包、Ubuntu的deb包類似的東西。本書多數時候直接使用APK這個縮寫,有時也會用APK指代Android套用。
Widget:這個很難翻譯,多數時候我直接使用英文單詞本身,在講述Qt套用框架時,我有時用控制項指代Widget。也有人將Widget翻譯為微件、視窗小部件……在Android上,Widget有其專門含義,特指由套用提供的顯示在桌面上的小部件。
AVD:Android Virtual Device,中文對應的名字,叫安卓虛擬設備、虛擬機、模擬器等,筆者有時用AVD,有時用模擬器。
MFC:Microsoft Foundation Classes,微軟基礎類庫的簡稱。
Activity:Android的應用程式組件,一般用活動一詞來指代它。你可以簡單地這么理解:一個Activity擁有螢幕上的一個可見視窗,能夠處理各種用戶事件,對用戶操作做出回響。