內容簡介
《Qt Quick核心編程》起始於基礎的開發環境搭建和Qt Creator快速介紹,幫助讀者正確使用開發環境;著力於QML語言基礎、事件、Qt Quick基本元素,輔以簡要的ECMAScript(JavaScript)語言介紹,使得讀者能夠快速熟悉Qt Quick的基本知識和開發過程;對於Qt Quick中的關鍵主題,如動畫、Model-View、Component、網路、多媒體,做了詳盡入微的講解,讓讀者一冊在手,別無他求;QML與C++混合編程、Canvas、定製及自定義控制項等高級主題,《Qt Quick核心編程》也做了詳細講解,同時提供了多個精彩的實作實例,力求概念清晰,用途明確。《Qt Quick核心編程》的內容適用於桌面與Android平台。值得一提的是,《Qt Quick核心編程》覆蓋了Android開發的多個主題,如拍照、定位、錄音、國際化、可伸縮界面等,也是使用Qt Quick進行移動開發不可錯過的。
《Qt Quick核心編程》的讀者對象為:希望學習一門高效的界面程式語言的開發人員;希望在多個移動設備(如智慧型手機)上構建流暢用戶界面的開發人員;有一定C/C++基礎,希望快速構建應用程式界面的開發人員;有一定Qt基礎,希望快速構建界面的開發人員;有一定QML基礎,想進階學習的朋友;想熟悉跨平台套用開發框架的開發人員。
內容提要
《Qt Quick核心編程》起始於基礎的開發環境搭建和Qt Creator快速介紹,幫助讀者正確使用開發環境;著力於QML語言基礎、事件、Qt Quick基本元素,輔以簡要的ECMAScript(JavaScript)語言介紹,使得讀者能夠快速熟悉Qt Quick的基本知識和開發過程;對於Qt Quick中的關鍵主題,如動畫、Model-View、Component、網路、多媒體,做了詳盡入微的講解,讓讀者一冊在手,別無他求;QML與C++混合編程、Canvas、定製及自定義控制項等高級主題,《Qt Quick核心編程》也做了詳細講解,同時提供了多個精彩的實作實例,力求概念清晰,用途明確。《Qt Quick核心編程》的內容適用於桌面與Android平台。值得一提的是,《Qt Quick核心編程》覆蓋了Android開發的多個主題,如拍照、定位、錄音、國際化、可伸縮界面等,也是使用Qt Quick進行移動開發不可錯過的。
《Qt Quick核心編程》的讀者對象為:希望學習一門高效的界面程式語言的開發人員;希望在多個移動設備(如智慧型手機)上構建流暢用戶界面的開發人員;有一定C/C++基礎,希望快速構建應用程式界面的開發人員;有一定Qt基礎,希望快速構建界面的開發人員;有一定QML基礎,想進階學習的朋友;想熟悉跨平台套用開發框架的開發人員。
目錄
第1章 Qt Quick概覽 1
1.1 什麼是Qt Quick 1
1.2 我們能用Qt Quick做什麼 2
第2章 Qt開發環境快速上手 3
2.1 Qt Creator簡介 3
2.2 Qt Creator下載與安裝 3
2.2.1 下載 3
2.2.2 安裝 4
2.3 Hello Qt Quick App 8
2.3.1 創建項目 8
2.3.2 運行項目 11
2.3.3 在手機上運行 12
2.4 Qt Creator集成開發環境 15
2.4.1 歡迎界面 15
2.4.2 編輯界面 18
2.4.3 調試界面 19
2.4.4 項目選項設定 20
2.5 善用佳軟之Qt Quick開發工具 21
2.5.1 Qt幫助 21
2.5.2 Qt Quick Designer 24
2.5.3 命令行環境 25
2.5.4 qmlscene 26
第3章 QML語言基礎 28
3.1 對象 28
3.2 表達式 29
3.3 注釋 30
3.4 屬性 31
3.4.1 屬性命名 31
3.4.2 屬性的類型 31
第4章 Qt Quick入門 35
4.1 Hello Qt Quick App再分析 35
4.1.1 基本程式結構 35
4.1.2 使用Item作為QML根對象 37
4.2 閒話Window 38
4.2.1 Window細說 38
4.2.2 ApplicationWindow 40
4.3 基本元素初體驗 40
4.3.1 Rectangle 40
4.3.2 顏色 41
4.3.3 漸變色 41
4.3.4 Item 42
4.3.5 使用錨布局 44
4.3.6 回響按鍵 46
4.3.7 Text 47
4.3.8 Button 50
4.3.9 ButtonStyle 51
4.3.10 Image 52
4.3.11 BusyIndicator 55
4.4 圖片瀏覽器的第一個版本 55
4.4.1 QML代碼 56
4.4.2 FileDialog 58
第5章 ECMAScript初探 59
5.1 語法 60
5.1.1 區分大小寫 60
5.1.2 弱類型 60
5.1.3 語句後的分號可有可無 61
5.1.4 注釋 61
5.1.5 代碼塊 61
5.2 變數 61
5.2.1 變數聲明 61
5.2.2 變數命名規則 62
5.2.3 關鍵字 62
5.2.4 保留字 63
5.2.5 原始值與引用值 64
5.3 原始類型 64
5.3.1 typeof運算符 64
5.3.2 Undefined類型 65
5.3.3 Null類型 65
5.3.4 Boolean類型 66
5.3.5 Number類型 66
5.3.6 String類型 67
5.4 類型轉換 67
5.4.1 轉換成字元串 68
5.4.2 轉換成數字 68
5.4.3 強制類型轉換 69
5.5 對象 70
5.5.1 Object 70
5.5.2 String 72
5.5.3 RegExp 75
5.5.4 Array 78
5.5.5 Math 80
5.5.6 Date 81
5.5.7 你不可不知的對象碎碎念 83
5.6 函式 84
5.6.1 函式語法 84
5.6.2 函式的返回值 85
5.7 表達式和運算符 85
5.7.1 表達式 85
5.7.2 算術運算符 86
5.7.3 賦值運算符 86
5.7.4 比較和邏輯運算符 87
5.7.5 條件運算符 88
5.7.6 位運算符 88
5.7.7 關鍵字運算符 88
5.7.8 逗號運算符 89
5.7.9 數組和對象存取運算符 89
5.7.10 優先權 89
5.8 程式控制語句 90
5.8.1 if-else語句 90
5.8.2 switch語句 90
5.8.3 for語句 91
5.8.4 while語句 92
5.8.5 do-while語句 92
5.8.6 break、continue和return 92
5.9 使用console 93
5.9.1 輸出日誌信息 93
5.9.2 斷言 94
5.9.3 計時器 94
5.10 內置對象 94
5.10.1 Global對象 94
5.10.2 JSON對象 96
5.11 來自QML的基本類型 98
5.11.1 url 99
5.11.2 list 99
5.11.3 enumeration 100
5.11.4 font 100
5.12 宿主對象Qt 101
5.12.1 Qt對象的屬性 101
5.12.2 Qt對象的枚舉類型 102
5.12.3 Qt對象的方法 102
第6章 Qt Quick事件處理 105
6.1 Qt Quick中的信號與槽 105
6.1.1 連線QML類型的已知信號 105
6.1.2 如何尋找感興趣的信號 109
6.1.3 定義自己的信號 115
6.1.4 信號與槽的連線 117
6.2 滑鼠 119
6.2.1 變色矩形示例 119
6.2.2 MouseArea 120
6.3 鍵盤 121
6.3.1 會動的文本實例 121
6.3.2 Keys與信號處理器 123
6.4 定時器 124
6.4.1 定時器對象介紹 124
6.4.2 倒計時程式 124
6.5 觸摸事件 126
6.5.1 PinchArea 127
6.5.2 縮放與旋轉實例 128
6.5.3 多點觸摸 130
第7章 組件與動態對象 133
7.1 Component(組件) 133
7.1.1 嵌入式定義組件 133
7.1.2 在單獨檔案中定義組件 134
7.2 使用Loader 137
7.2.1 Loader詳細介紹 137
7.2.2 從檔案載入組件 142
7.2.3 利用Loader動態創建與銷毀組件 143
7.3 在ECMAScript中動態創建對象 146
7.3.1 從組件檔案動態創建Component 146
7.3.2 從QML字元串動態創建Component 148
7.3.3 銷毀動態創建的對象 149
第8章 Qt Quick元素布局 152
8.1 定位器 152
8.1.1 Row 152
8.1.2 Colomun 154
8.1.3 Grid 155
8.1.4 Flow 158
8.1.5 定位器嵌套 160
8.2 布局管理器 162
8.2.1 GridLayout 163
8.2.2 RowLayout 166
8.2.3 ColumnLayout 168
8.3 其他的布局方式 169
第9章 Qt Quick常用元素介紹 170
9.1 行編輯(TextInput與TextField) 170
9.1.1 TextInput 170
9.1.2 TextField 172
9.2 文本塊(TextEdit與TextArea) 172
9.2.1 TextEdit 173
9.2.2 TextArea 173
9.3 ExclusiveGroup 174
9.4 RaidoButton 174
9.4.1 RadioButtonStyle 174
9.4.2 實例:選擇你喜歡的手機作業系統 175
9.5 CheckBox 177
9.5.1 CheckBoxStyle 178
9.5.2 實例:那些你喜歡的愛情電影 178
9.6 GroupBox 180
9.7 ComboBox 182
9.7.1 ComboBoxStyle 183
9.7.2 ComboBox綜合演示 183
9.8 ProgressBar 187
9.8.1 ProgressBarStyle 187
9.8.2 進度條綜合演示 188
9.9 TabView 191
9.9.1 標籤控制項簡單示例 192
9.9.2 使用TabViewStyle 193
9.10 Slider 196
9.10.1 SliderStyle 197
9.10.2 滑塊簡單示例 197
9.11 Flickable 199
9.12 Screen對象 200
第10章 Canvas(畫布) 202
10.1 開始之前 202
10.1.1 畫布 202
10.1.2 畫師 203
10.1.3 畫筆 203
10.1.4 畫刷 203
10.1.5 坐標系 203
10.1.6 圖元 204
10.2 基本繪圖模式 204
10.3 繪製路徑 206
10.4 繪製文本 209
10.5 繪製圖片 211
10.6 變換 215
10.7 裁切 219
10.8 圖像合成 220
10.9 挖頭像實例 221
10.9.1 項目創建 221
10.9.2 C++代碼 222
10.9.3 QML代碼分析 223
第11章 C++與QML混合編程 228
11.1 在QML中使用C++類和對象 229
11.1.1 定義可以導出的C++類 229
11.1.2 註冊一個QML可用的類型 235
11.1.3 完整的ColorMaker實例 237
11.1.4 將一個C++對象導出為QML屬性 239
11.2 在C++中使用QML對象 242
11.2.1 查找一個對象的孩子 243
11.2.2 使用元對象調用QML對象的方法 243
11.2.3 callQml示例 244
11.3 美圖實例 248
11.3.1 美圖實例效果 248
11.3.2 圖像處理算法 250
11.3.3 源碼情景分析 256
第12章 動畫 264
12.1 動畫元素分類 264
12.2 基本動畫元素 265
12.2.1 Animation 265
12.2.2 PropertyAnimation 266
12.2.3 NumberAnimation 270
12.2.4 ColorAnimation 273
12.2.5 RotationAnimation 273
12.2.6 PathAnimation 275
12.2.7 SmoothedAnimation 278
12.2.8 SpringAnimation 279
12.3 組合動畫 280
12.3.1 ParallelAnimation 280
12.3.2 SequentialAnimation 281
12.4 State 283
12.4.1 使用State變換文本的小示例 283
12.4.2 State詳解 284
12.4.3 PropertyChanges 286
12.4.4 ParentChange 289
12.4.5 AnchorChanges 292
12.4.6 StateChangeScript 294
12.5 Transition 296
12.6 協同動畫元素 302
12.6.1 Behavior 303
12.6.2 ParentAnimation 304
12.6.3 AnchorAnimation 305
12.7 實例:射泡泡遊戲 306
12.7.1 遊戲介紹 307
12.7.2 源碼情景分析 310
第13章 Model/View 318
13.1 ListView 319
13.1.1 ListView的簡單使用 319
13.1.2 header 323
13.1.3 footer 326
13.1.4 訪問與修改Model 330
13.1.5 動畫效果 336
13.1.6 section 343
13.2 XmlListModel的用法 347
13.2.1 XPath簡介 347
13.2.2 XmlRole 349
13.2.3 XmlListModel的屬性與方法 349
13.3 使用C++ Model 354
13.3.1 C++實現QML可用的Model 354
13.3.2 將Model導出到QML中 359
13.3.3 QML代碼的變化 360
13.4 TableView 362
13.4.1 一個簡單的TableView實例 362
13.4.2 定製表格外觀 364
13.4.3 動態修改TableView 368
13.5 實例:股票跟蹤 368
13.5.1 你的樣子 369
13.5.2 項目創建 370
13.5.3 main.cpp分析 372
13.5.4 TableView外觀定製 373
13.5.5 QML與C++混合套用的國際化 375
13.5.6 Qt on Android套用國際化 376
13.6 GridView 377
13.7 PathView 379
13.7.1 Path簡介 380
13.7.2 PathAttribute 385
13.7.3 PathPercent 386
13.7.4 使用PathView 386
13.8 找圖看實例 390
13.8.1 功能與界面 390
13.8.2 QML多界面切換 392
13.8.3 創建自己的QML按鈕 394
13.8.4 本地瀏覽 395
13.8.5 網路圖片搜尋 399
13.9 Repeater 400
13.9.1 model為數字 400
13.9.2 model為字元串列表 401
13.9.3 model為對象列表 402
13.9.4 model為ListModel 403
13.10 ListView的下拉刷新效果 405
13.10.1 C++ Model 405
13.10.2 QML代碼分析 408
第14章 多媒體 410
14.1 MediaPlayer 410
14.1.1 播放音樂 410
14.1.2 視頻 413
14.1.3 多媒體元信息 414
14.2 拍照 415
14.2.1 配置Camera 415
14.2.2 設定取景器VideoOutput 418
14.2.3 捕獲靜態圖片 419
14.2.4 簡單的拍照實例 419
第15章 網路 426
15.1 大珠小珠落玉盤——支持網路的對象 426
15.1.1 Image 426
15.1.2 Qt.createComponent 426
15.1.3 Loader對象 427
15.1.4 QQmlApplicationEngine 427
15.1.5 QQuickView 427
15.1.6 MediaPlayer 428
15.2 QML里的HTTP 428
15.2.1 XMLHttpRequest類介紹 428
15.2.2 GET小示例 430
15.2.3 POST數據 433
15.3 使用C++代碼完成複雜的網路操作 433
第16章 定位 435
16.1 類庫介紹 435
16.1.1 coordinate 435
16.1.2 QtPositioning 436
16.1.3 Position 436
16.1.4 PositionSource 436
16.2 團購查詢實例 437
16.2.1 百度API說明 437
16.2.2 手機運行效果 438
16.2.3 源碼分析 439
第17章 綜合實例之檔案查看器 443
17.1 檔案查看器的運行效果 444
17.2 再論ApplicationWindow 445
17.3 MenuBar 447
17.3.1 Menu 447
17.3.2 MenuItem 448
17.3.3 Action 448
17.4 ToolBar 449
17.5 使用XMLHttpRequest載入本地檔案 450
17.6 使用標準對話框 450
17.6.1 ColorDialog 451
17.6.2 MessageDialog 452
17.7 源碼分析 453
17.7.1 QML代碼 453
17.7.2 C++代碼 461
17.7.3 項目檔案 461
第18章 綜合實例之聊哈 462
18.1 界面效果 462
18.2 分析 465
18.2.1 適應多種解析度 465
18.2.2 聊天界面實現分析 469
18.2.3 錄音與回放 471
18.2.4 聊天協定 475
18.2.5 MessengerManager 485
18.2.6 AccessPointModel 486
附錄A 常見問題 487
該怎么學習Qt Quick 487
如何發布Qt Quick套用 487
怎樣保持Android手機螢幕常亮 489
我想創建可擴展的UI來適應各種螢幕 489
Qt Quick套用如何國際化 490
Qt Quick套用體積太大了啊 490
有沒有靜態庫版本的Qt 490
我不想讓別人看見我的QML文檔 490
Android上的Qt Quick控制項看起來和系統風格不一樣 490
自己做一些Qt Quick控制項怎么樣 491
Qt Quick不支持檔案操作嗎 491
想用資料庫來著…… 491
說真的,本書示例代碼在哪兒可以下載 491
參考文獻 492
聊聊寫作期間聽的音樂 493
作者簡介
安曉輝
1998年保送入西安交大教改班,2002年畢業進入西安大唐電信從事售後技術支持工作,2005年3月離職,始習編程之術。在此期間,有個人文集收錄於各大文學站點與論壇,部分散文、小說、書評見諸雜誌與報紙。國內第一本BBS原創文集《指尖的飛翔》(兵馬俑BBS原創文學精選)作者之一。網路文學選集《竹林聽海》作者之一。
2005年4月有幸加盟西安信利軟體科技有限公司,參野狐禪,走開發路。
2008年見 Qt 而傾心,用之於GUI、網路伺服器、嵌入式開發,帶領團隊成功開發出基於 Qt 的網際網路電視機頂盒。2012年移植 Qt Embedded 4.5.2 到 Android 平台並套用於智慧型機頂盒項目。
著有暢銷書《Qt on Android核心編程》,國內第一本側重於介紹Qt在安卓移動開發中套用的好書!
媒體評論
Qt以跨平台和高性能著稱,只要你在這方面有需求,我相信你一定評估過Qt。但Qt畢竟是一個小眾的開發框架,很多人擔心它的學習資源不夠豐富而難以掌握,害怕真正套用起來會被“坑”,因此望而卻步,敬而遠之。本書的出版足以解決你的後顧之憂!讀一本書,洞察一門有用的技術;一次愉快的對話,在“悅享品質”的過程中交一位有共同語言的朋友——此書值得擁有!
——愛奇藝技術總監 陸其明
自己學一個開發框架可能不難,但是要系統地整理出來著書遠非易事。本書全面、系統化地介紹了Qt Quick的相關知識,是能給廣大從業人員以幫助的好作品。
——淘寶技術部總監 曾憲傑(花黎)
Qt Quick是Qt新推的UI框架,快速、簡潔、靈活、強大,但相關書籍太少,此書正好填補了空白,全面、基礎而且有一定的深度,每個例子都由作者精心選擇和測試,可見作者是用心在寫這本書。
——浙江力太科技有限公司技術總監、高級系統分析師、IPMA項目經理 谷偉年
foruok的技術部落格寫的不錯,其博文行雲流水、邏輯清晰,我個人一直是其忠實冬粉。《Qt Quick核心編程》別出機杼,在細緻、紮實地講述QML技術的同時,融入了作者多年的一線軟體開發實戰經驗以及文藝程式設計師特有的幽默,非常適合對編程技術精益求精的開發者閱讀。
——西安OpenParty組織者之一、葡萄城控制項社區經理 王文剛
你想讓你的軟體擁有直觀、現代、如行雲流水般的界面么?你想為其添加動畫、音效、過場等效果么?本書幽默詼諧的語言, 生動直觀的例子,將帶你逐步領略Qt Quick編程的美妙所在。
——Nokia (Digia) Certified Qt Specialist,CSDN部落格認證專家 張德保(dbzhang800)
《Qt Quick核心編程》花了大量篇幅講解Controls、Styles、Events、Model-View、Animation、Canvas等主題,甚至連JavaScript都講了!不僅如此,每個章節還都提供相關示例並詳細介紹,充分體現出foruok對讀者的關心與細心。foruok的這本書無論是廣度上還是深度上都做到了極致,不管是對想入門的朋友還是想進階提升的朋友來講,都是不可多得的佳作。
——QTCN開發網QML開發版版主,資深Qt/QML開發者 寒山-居士(toby520)
我很榮幸向大家推薦foruok的新書。Qt是一款非常優秀的開發框架,如今Qt的安卓版,iOS版和WP版都可供開發者使用了,如果大家能夠掌握Qt的開發,那么就擁有了全平台開發的能力以及對接未來軟體開發平台的優勢。有很多開發者經常向我們詢問移動開發和QML的點點滴滴。幸運的是,這本書填補了這方面的空白,你再也不用在黑暗中摸索了!這是真的嗎?這是真的。
——Qt移動開發先驅、遊戲開發者、“上海Qt開發聯盟”QQ群群主 彩陽
QML和C++混合編程是Qt的趨勢,描述性界面和邏輯運算分開也是發展的趨勢。此書既有豐富的QML內容,又將如何與Qt C++結合講述得很到位,對我們一直全部用Qt Widgets(C++)開發者來說,是打開Qt Quick的一把金鑰匙。
——QTCN開發網Qt基礎編程版版主 渡世白玉
《Qt Quick核心編程》是一本由淺入深、系統實用的Qt Quick編程書籍。作者深諳開發人員的學習曲線,在內容的安排上,使人有“走到哪都水到渠成,學到哪都柳暗花明”的感覺,既適合初觸Qt Quick編程的讀者,也可供有經驗的開發者參考進行深入系統的學習。
——QTCN開發網Qt代碼秀討論區版主 realfan
前言
為什麼寫作本書
今年(2014年)4月份,我開始寫作《Qt on Android核心編程》,該書主要講述Qt on Android的核心技術,比如信號與槽、元對象系統、Qt與Android的銜接、Android相關的開發主題等,對於界面開發,還是基於Qt傳統的Widgets。
在寫作的過程中,不斷有技術同仁向我諮詢Qt Quick的問題,有諸如對象如何聲明、怎樣定義函式等入門級的問題,也有QML與C++如何互動、如何定製ListView等進階問題……於是我想,為什麼大家關注Qt Quick與QML?結論很簡單,正如Qt Quick的名字一樣,用它來開發界面,真是飛一般的感覺;更讓人快感迭起的是,Qt Quick里的絕大多數界面元素,都可以定製,都是任人裝扮的小姑娘,甚至還可以從頭開始快速構建專屬於你的界面組件;還有頂頂重要的是,QML與Qt C++的完美結合為開發者帶來了無與倫比的靈活性。
但是限於篇幅,這些精彩不能夠在《Qt on Android核心編程》一書中介紹。於是我決定另寫一本專門講述Qt Quick的書籍,而且定位在入門層面,因為我本人也才入門而已。
Qt 5之後,Qt Quick與Qt Widgets並駕齊驅,成為Qt界面技術的雙飛翼。而介紹Qt Quick本身的技術資料、書籍卻少之又少。搜遍網際網路,也很難找到系統介紹Qt Quick的文章,多數是開發者使用某個主題後的片段記錄與日誌。即使這些寶貴的經驗片段,也因為Qt Quick版本的問題而不一定能夠正常使用。更可惜的是,Qt Quick適用於Android等移動平台,而這方面的資料和實踐,卻更加芳蹤難覓。所有這一切,既給我的學習增加了困難,也堅定了我寫一本Qt Quick入門書籍的決心。
做出這個決定的過程也頗為艱難,因為寫作《Qt on Android核心編程》給我和家人的生活帶來了非常大的影響。獨自完成一本書是一項非常浩大的工程,工作量不說,所花心思是極多極難量化的:你會擔心選取的主題、角度是否合適,你提供的示例不僅要在語法和運行層面上正確,還要思量它是否能恰到好處地演示你講解的主題……而在你念茲在茲、廢寢忘食、心無旁騖、形容枯槁地琢磨著寫作時,你也忽略掉了身邊的老婆、孩子、親友,你整天都在飄啊,挺奇怪的感覺,乾什麼事兒都是人在心不在,這樣的你,對身邊親友的影響可想而知。我剛剛從這種狀態中出來,還未及好好地放鬆幾天,就又決定重開爐灶,鍛鑄新兵,對於我的老婆、孩子,都是很難啟口之事。可是我又擔心一旦放下當前火熱的念頭,哪天想重新來過時,卻激情不再冷灰難燃。於是我偷偷地開始了這項工作,直到進行了將近一半時,才告訴老婆,相信她能理解,而她也確實理解並支持我,她是我最該感謝的人。
寫作本書的過程,也是我學習的過程,書中多數章節都來源於我在自學時記錄的筆記和完成的示例。對於我遇到的困惑,對於那些讓我輾轉反覆難以理解的主題,我特意將這個主題本身、它牽涉到的其他主題、它需要的基礎知識都一一記錄下來,能放在一起講解的儘量放在一起,需要獨立成章的,也費盡心思安排前後順序。可以說,這本書是我在Qt Quick這條路上練級打怪的備忘錄。
每當完成一個章節、一個示例時,我都感到由衷的高興,可也感到莫名的失落:就快要結束了……當初《Qt on Android核心編程》完稿時,我就對這種愛女遠飛、空虛、落寞、失去憑藉與寄託的感覺很不適應。而現在我再次經歷著這一切,我其實希望這是一場沒有終點的旅行,但,它不是。
我把這一切記錄在這裡,我想說,愛過,寫過,失落過,高興過,低徊過,迷惘過,不管怎樣,我從未對那些流過的汗水、付出的精力後悔過,如果還有機會,我還願意再這樣走上一遭。
致謝
首先要感謝的,是本書的策劃編輯高洪霞老師,沒有她的支持和幫助,寫作本書的旅程很難有機會成行。在寫作過程中,高老師也給予了我很多關切以及中肯的建議,對本書的寫作具有至關重要的意義。
我要特別感謝本書的文字編輯葛娜老師,她辛苦而卓有成效的工作,使得書稿更為整潔、漂亮。
還要感謝出版社以及本書的各位編輯,沒有你們的辛苦付出和鼎力幫助,本書絕難順利付梓出版。
接下來要感謝的,是我的老婆趙建媛女士,儘管她陪我經歷了寫作《Qt on Android核心編程》的恐怖旅程,但還是義無反顧地跟我踏上了新的征途。她寬容、大度、善解人意,毫不計較我的先斬後奏,在精神上和行動上給予我無限支持。我對寫書心無旁騖,而對她的關心呈指數下降仿若移情別戀,但她依然微笑著陪我前行。沒有老婆不拋棄、不放棄的支持,實在難以想像我可以再次完成“寫作一本書”這樣曠日持久、龐大浩繁的工程。
另外,還要感謝我美麗可愛的女兒安悅瑄小朋友,此時她已快五歲了(10月份生日),看到我又開始寫書,她就問我之前的書什麼時候可以出來,她想要一本,還說將來寫書也給我一本。我們已經約定好了,就差拉鉤上吊一百年不許變誰變誰是小狗啦。
特別感謝上海Qt開發聯盟和Qt 5 for Android/iOS這兩個群的群友們。真心感謝那些解答我疑問、幫我做試驗的大神們,你們的大愛無疆與高風亮節幫助我避開了修煉Qt Quick這門高深武術時常見的各種走火入魔症狀。由衷地感謝那些不斷向我提問的Q友們,你們總能擊中我的軟肋,讓我痛定思痛繼續修煉始終不忘初心。
必須感謝所有在我寫作期間對我噓寒問暖、給予我幫助的朋友們,是你們讓我覺得世界如春風如秋陽,溫暖宜人,你們與神同在,光芒照耀四方。
最後,也最應該感謝的,是肯花費時間和精力閱讀本書的讀者,你們的意見和建議,我會視若珍寶並以之為鞭奮力前行。
本書適合誰
本書是專門講述Qt技術中的Qt Quick框架的。Qt Quick可以作為一項獨立技術而存在,只使用Qt Quick就可以構建功能豐富的套用。如果結合Qt C++,則可以讓你肋生雙翅,翱翔藍天。
如果你從未接觸過Qt而希望直接學習Qt Quick,沒有任何問題,本書行文時已作考慮,以期自成一體,除了第11章以及部分混合使用QML與C++的示例,其他章節都不需要專門的Qt基礎,也不需要專門的C、C++基礎。正如書名所示,本書是Qt Quick的入門導引,是將其作為一門新語言、一項新技術來介紹的。
第2章從零開始,詳細地介紹了Qt SDK的安裝、Qt Creator IDE、基於Qt Quick的Hello World,還介紹了行走江湖必備的工具——Qt幫助和qmlscene。
第3章簡要介紹了QML語言的入門基礎,讓你能夠快速看懂、理解QML文檔,能夠自己動手做一些小實驗。
第4章在Hello World的基礎上分析了Qt Quick套用的基本程式結構,同時引入了對Window、Rectangle、Button、Text、Image等常見元素的介紹,讀完這章,你已經可以完成一些有實際意義的套用軟體了。
雖然第2~4章可以讓你快速跨過Qt Quick的門檻,進入絢爛多姿的新世界,可它們也留下了很多疑問,因此我精心準備了第5章——ECMAScript初探,以便幫助你查漏補缺,建立堅實的QML基礎。
如果你有C++基礎,沒有GUI編程經驗,現在想開發跨平台的套用軟體,那么本書可以幫助你達成願望。選擇Qt進行任何類型的軟體開發都是十分明智的。你不但可以獲得令人嘆為觀止的用戶界面和非同凡響的性能,還能讓它們運行在多種螢幕、設備、作業系統、平台上,這簡直無法用語言形容。而Qt Quick,可以讓你從容地從零開始這曼妙的旅程。
本書的第6~9章進一步帶你熟悉Qt Quick,事件處理、更多的基礎控制項、動態載入控制項、創建屬於你自己的元素、在界面上合理安排眾多的UI元素,有了這些進階知識,你可以更為自如地打造你的套用了。
如果你已經能夠熟練地使用Qt C++開發軟體,有一定的GUI編程經驗,現在想學習Qt Quick,想更加快速、高效地完成各種套用,本書也適合你,你會發現既有的經驗可以讓自己更快地熟悉Qt Quick的各種主題。比如第10章的Canvas、第11章的C++與QML混合編程、第12章的動畫、第13章的Model/View、第14章的多媒體、第15章的網路,在Qt C++中都可以找到對應的主題……總之,有了Qt C++的基礎,會事半功倍。
如果你已經有一定的Qt Quick基礎,本書也可以幫助你鞏固和完善既有的知識與經驗,筆者相信本書提供的ECMAScript基礎(第5章)、Qt Quick事件處理(第6章)、動畫(第12章)、Model/View(第13章)、QML與C++混合編程(第11章)等,都是在別處很難獲得的、相當詳盡的系統性論述。
總之,本書針對以下讀者群:
想開發GUI套用、有一定編程經驗的開發人員。
熟悉C++或其他開發語言,熟悉面向對象程式設計的有經驗的開發人員。
熟悉Qt C++,由於Qt Quick與Qt相關而想了解它的開發人員。
有一定的Qt Quick基礎,想更好地了解它的初學者。
熟悉Qt Quick,想更好地了解各種主題細節的進階開發者。
有特定平台開發經驗,希望開發跨平台套用的開發者。
熟悉Web頁面開發,現在需要開發本地套用的開發者。
有計算機基礎,想學習GUI編程的愛好者。
那么,本書不適合誰呢?沒有任何計算機科學基礎背景、連辦公軟體都沒用過、不能理解軟體為何物的超級初學者,建議還是先找其他書籍看看。
你需要什麼技術基礎
Qt Quick是以Qt和ECMAScript為基礎的,而Qt是基於C++的。
如果你有一點C++、Java、JavaScript或其他程式語言的基礎而不熟悉GUI編程,學習本書可能會遇到一些挑戰,但在你的努力之下,佛擋殺佛,鬼阻殺鬼,浴火重生,觸手可及。
如果你既有面向對象語言基礎,又有GUI開發基礎,本書對於你來講僅僅是舉一反三、觸類旁通的過程,你會享受到征服新大陸的快感。
如果你有Qt基礎,那么學習本書將是非常愉快的旅程。
如果你想要進行Android開發,請先閱讀筆者的《Qt on Android核心編程》,有了它,你會發現本書涉及Android的主題和示例都會變得面目可親。
你需要什麼軟硬體環境
筆者使用Windows 7作為開發環境,可供參考。
至於開發主機的硬體配置,筆者建議配置為:
雙核以上CPU。
4GB以上記憶體。
而為了驗證部分套用在移動設備上的效果,你還需要一部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……
類(Class):眾多的具有相同屬性和操作的事物的抽象,冷冰凍的模板,不會哭也不會笑,它存在的唯一目的,就是為了讓開發者根據它創建對象。
對象定義:ECMAScript中沒有類的說法,只有對象定義,其實也是創建對象的模板,與類相近。本書很少用到它,一般使用“類”這個詞。
對象(Object):以某一個類為模板創建出來的具體化的事物,它有自己的屬性、方法,是有血有肉的活物,一顰一笑,一舉手一投足,各種風流韻味都是它自己的,正所謂龍生九子各個不同也。
實例化:從類創建對象的過程,叫作實例化。
實例:對象的同義詞。本書有時使用對象,有時使用實例,因上下文而變。
雞一嘴鴨一嘴
本書中多次提到Qt SDK路徑和源碼路徑,使用了C:\xxx之類的字串,這都是基於作者的開發環境來講的,你電腦上的路徑,與你安裝Qt SDK時的配置有關。
書中示例代碼,有時因為排版的原因做了人為折行處理,導致部分代碼看起來不符合ECMAScript的語法,如果你照錄代碼進行試驗,請注意此點。
在非代碼的段落,有時為了排版的原因,某些類名、變數名、英文字詞可能會被插入空格。
示例代碼中的部分很長的語句(如字元串、URL等)無法簡單地折行,保持了自然本色,請你留意。
你看到的配圖,是黑白的或者帶點兒灰度,這是印刷的原因,如果你運行示例,看到的應該是彩色的。行文時筆者有時也會用到“藍色矩形”之類的字眼,而如果你看到的是灰不溜秋的一坨色塊,還請淡定,這都是月亮惹的禍。