五一假期前收到了人民郵電出版社寄來的書,我們寫的《Qt 5.9 C++開發指南》終於正式印刷出來了!從2016年11月開始寫書,到今天終於印刷出版,歷時約一年半,現在它終於面世了。
成書過程
由於做項目的需要,在2014年開始轉而用Qt編寫軟體。在本人學習Qt的過程中,買了好幾本市面上可以買到的Qt編程的書,但是沒有發現特別滿意的書。《C++ GUI Qt 4編程》和《Qt高級編程》雖然是比較經典的書,但是內容是基於Qt 4的,一些內容與Qt 5已經不兼容,照著這兩本書學習經常出現問題。有的書寫的像軟體使用手冊,缺乏完整的實例,只有類的特性的羅列和簡短示例代碼。有的書的實例程序包含大量構造UI的冗餘代碼,淹沒了主要特性的說明,有擴充頁數的嫌疑。有的書甚至只是列出實例代碼,解說的很少。
作為一個既從事於教學工作,又一直從事軟體開發的教育工作者,深知該如何學習和一個程式語言,也深知該如何由淺入深、通過實例和練習教學生學習一門程式語言。於是,在2016年底正好暫時沒有什麼項目要做,就決定開始寫一本Qt編程的書,將自己的經驗總結為一本書,為學習Qt的同學們提供一本有價值的書。
由於是自發決定寫的一本書,沒有項目資助(其實也根本不需要),也沒有約稿時間限制,寫作更加自由,完全按照自己的內容安排和時間進度來寫。開始寫書之後,除了日常的教學工作外,閒暇的時間幾乎全花在寫書上了。為了一個小的編程主題的實例程序,我可能花好幾天編程並完善,然後再整理寫出來。慢工出細活,全書的初稿用了10個月才完成,又用了1個月時間檢查和修改。
完成全書後,我與人民郵電出版社聯繫並發去樣章,很快收到肯定的答覆,經過幾次聯繫後就籤訂了出版合同。最終稿交給出版社之後,就由出版社編輯和排版,並按流程安排出版了。在此,非常感謝人民郵電出版社,特別要感謝負責此書的楊編輯。
我素來信奉「君子先行其言而後從之」的原則,在書沒有寫好之前不聯繫出版社,在書沒有正式印刷出版之前不發布任何消息。現在書已經正式印刷出版了,好東西也需要介紹推廣的,不然就是「養在深閨人未識」了,所以下面對本書的特點做一個介紹。
本書特點
Qt是非常優秀的跨平臺應用開發框架,在專業應用軟體開發方面,如果要考慮跨平臺,Qt 幾乎是最好的選擇。
1. 本書專注介紹Qt C++編程,Qt 的C++類庫是Qt的核心,適合於開發跨平臺的桌面應用程式,例如在專業應用軟體開發方面一般使用QtC++。本書不涉及Qt的另外一個程式語言QML,QML適合於開發移動平臺上的應用。
2. 本書在介紹各個編程主題的編程原理時,注重通過實例講解編程原理,同時也注意總結類的主要用法。每個主題都精心設計了完整的實例程序,很多實例的原始碼甚至可以直接用於自己的軟體項目裡,例如8.3節介紹Graphics View繪圖架構時設計了一個小型的矢量圖繪圖軟體,能用這個程序可以進行簡單的矢量圖繪製。
基於Graphics View結構的矢量圖繪圖程序
3. 本書注意由淺入深地講解編程原理,將一些基本方法和原理講透徹。例如,在第2章「GUI應用程式設計基礎」裡先介紹了用Qt Creator設計的.ui文件的原理,應用程式如何由.ui文件自動創建界面,再介紹手工代碼創建界面的原理,搞清楚兩種方法的關聯之後,再介紹混合方式靈活設計UI界面。
4.本書注重內容的嚴謹性,所有實例程序均經過編譯和測試,需要額外資料進行說明的地方均註明連結地址或搜索關鍵字。例如第15章介紹攝像頭編程時,Windows平臺不能實現攝像頭錄像,對此問題進行了說明,還給出了在Qt官網上的搜索關鍵字,可以查看原始信息。
5. 本書介紹了 Qt Charts和Data Visualization兩個模塊的編程方法,這兩個模塊是Qt 5.7以後才引入社區版的,其他有關Qt編程的書籍裡都沒有介紹過。Qt Charts是一個非常有用的模塊,可以繪製各種圖表,在專業軟體中可以繪製更複雜的圖形。例如,在本人開發的微地震數據處理軟體中,就用Qt Chart顯示多道SEGY文件的波形曲線。
SEGY文件顯示與信號處理
6. 本書不介紹C++語言基礎,要求讀者具有一定的C++語言基礎。
7. 本書雖然主要介紹的是Windows平臺下的Qt C++編程,但是所涉及的Qt C++類的用法在Linux、macOS、嵌入式等平臺上也是一樣的。
本書適合於具有C++語言基礎,想要學習Qt C++,並準備用Qt C++編寫應用軟體的讀者。
這本書是本人的傾心傾力之作,也是因為對編程非常感興趣,對實際學習和使用經驗的總結和整理。雖然不是什麼學術著作,但是它對於學習Qt的讀者應用是有用的,這也就是其價值所在了,也是值得欣慰的了。
如何購買
本書由人民郵電出版社公開出版,在京東、噹噹、天貓、淘寶等各大電商平臺有售。建議在京東的人民郵電出版社官方旗艦店購買,並給個好評哦。
本人郵箱wangwb@upc.edu.cn,有何疑問或建議敬請聯繫我。
京東的連接地址如下:
https://item.jd.com/27593118120.html
目 錄
第 1章 認識Qt 1
1.1 Qt簡介 1
1.2 Qt的獲取與安裝 1
1.2.1 Qt的許可類型 1
1.2.2 Qt的版本 2
1.2.3 Qt的下載與安裝 2
1.3 Qt Creator初步使用 5
1.3.1 Qt Creator的界面組成 5
1.3.2 Qt Creator的設置 6
1.4 編寫一個Hello World程序 7
1.4.1 新建一個項目 7
1.4.2 項目的文件組成和管理 10
1.4.3 項目的編譯、調試與運行 11
1.5 在Visual Studio裡使用Qt 13
第 2章 GUI應用程式設計基礎 16
2.1 UI文件設計與運行機制 16
2.1.1 項目文件組成 16
2.1.2 項目管理文件 16
2.1.3 界面文件 17
2.1.4 主函數文件 19
2.1.5 窗體相關的文件 20
2.2 可視化UI設計 25
2.2.1 實例程序功能 26
2.2.2 界面組件布局 26
2.2.3 信號與槽 29
2.2.4 可視化生成槽函數原型和框架 30
2.3 代碼化UI設計 34
2.3.1 實例功能 34
2.3.2 界面創建 34
2.3.3 信號與槽的關聯 37
2.4 混合方式UI設計 37
2.4.1 設計目的 37
2.4.2 創建項目並添加資源文件 38
2.4.3 設計Action 39
2.4.4 設計菜單和工具欄 41
2.4.5 代碼創建其他界面組件 44
2.4.6 Action的功能實現 45
2.4.7 手工創建的組件的信號與槽 47
2.4.8 為應用程式設置圖標 48
2.5 Qt Creator使用技巧 48
第3章 Qt類庫概述 50
3.1 Qt核心特點 50
3.1.1 概述 50
3.1.2 元對象系統 50
3.1.3 屬性系統 52
3.1.4 信號與槽 53
3.1.5 元對象特性測試實例 55
3.2 Qt全局定義 59
3.2.1 數據類型定義 60
3.2.2 函數 60
3.2.3 宏定義 61
3.3 容器類 62
3.3.1 容器類概述 62
3.3.2 順序容器類 63
3.3.3 關聯容器類 64
3.4 容器類的迭代 66
3.4.1 Java類型迭代器 66
3.4.2 STL類型迭代器 68
3.4.3 foreach關鍵字 69
3.5 Qt類庫的模塊 70
3.5.1 Qt基本模塊 71
3.5.2 Qt附加模塊 71
3.5.3 增值模塊 72
3.5.4 技術預覽模塊 72
3.5.5 Qt工具 73
第4章 常用界面設計組件 74
4.1 字符串與輸入輸出 74
4.1.1 字符串與數值之間的轉換 74
4.1.2 QString的常用功能 76
4.2 SpinBox的使用 78
4.3 其他數值輸入和顯示組件 80
4.3.1 實例功能 80
4.3.2 各組件的主要功能和屬性 80
4.3.3 實例功能的代碼實現 82
4.4 時間日期與定時器 84
4.4.1 時間日期相關的類 84
4.4.2 日期時間數據與字符串之間的轉換 84
4.4.3 QCalendarWidget日曆組件 87
4.4.4 定時器的使用 87
4.5 QComboBox和QPlainTextEdit 89
4.5.1 實例功能概述 89
4.5.2 QComboBox的使用 89
4.5.3 QPlainTextEdit的使用 91
4.6 QListWidget和QToolButton 93
4.6.1 實例功能簡介 93
4.6.2 界面設計 94
4.6.3 QListWidget的操作 97
4.6.4 QToolButton與下拉式菜單 99
4.6.5 創建右鍵快捷菜單 101
4.7 QTreeWidget和QDockWidget 102
4.7.1 實例功能概述 102
4.7.2 界面設計 103
4.7.3 QTreeWidget操作 105
4.7.4 QLabel和Qpixmap顯示圖片 110
4.7.5 QDockWidget的操作 111
4.8 QTableWidget的使用 112
4.8.1 QTableWidget概述 112
4.8.2 界面設計與初始化 113
4.8.3 QTableWidget操作 114
第5章 Model/View結構 120
5.1 Model/View結構 120
5.1.1 Model/View基本原理 120
5.1.2 數據模型 121
5.1.3 視圖組件 122
5.1.4 代理 122
5.1.5 Model/View結構的一些概念 123
5.2 QFileSystemModel 125
5.2.1 QFileSystemModel類的基本功能 125
5.2.2 QFileSystemModel的使用 125
5.3 QStringListModel 127
5.3.1 QstringListModel功能概述 127
5.3.2 QStringListModel的使用 127
5.4 QStandardItemModel 130
5.4.1 功能概述 130
5.4.2 界面設計與主窗口類定義 131
5.4.3 QStandardItemModel的使用 132
5.5 自定義代理 139
5.5.1 自定義代理的功能 139
5.5.2 自定義代理類的基本設計要求 139
5.5.3 基於QSpinBox的自定義代理類 139
5.5.4 自定義代理類的使用 141
第6章 對話框與多窗體設計 143
6.1 標準對話框 143
6.1.1 概述 143
6.1.2 QFileDialog對話框 144
6.1.3 QColorDialog對話框 146
6.1.4 QFontDialog對話框 146
6.1.5 QInputDialog標準輸入對話框 147
6.1.6 QMessageBox消息對話框 149
6.2 自定義對話框及其調用 150
6.2.1 對話框的不同調用方式 150
6.2.2 對話框QWDialogSize的創建和使用 152
6.2.3 對話框QWDialogHeaders的創建和使用 154
6.2.4 對話框QWDialogLocate的創建與使用 156
6.2.5 利用信號與槽實現交互操作 160
6.3 多窗體應用程式設計 162
6.3.1 主要的窗體類及其用途 162
6.3.2 窗體類重要特性的設置 163
6.3.3 多窗口應用程式的設計 165
6.4 MDI應用程式設計 170
6.4.1 MDI簡介 170
6.4.2 文檔窗口類QFormDoc的設計 171
6.4.3 MDI主窗口設計與子窗口的使用 173
6.5 Splash與登錄窗口 176
6.5.1 實例功能概述 176
6.5.2 對話框界面設計和類定義 177
6.5.3 QDlgLogin類功能實現 178
6.5.4 Splash登錄窗口的使用 181
第7章 文件系統和文件讀寫 182
7.1 文本文件讀寫 182
7.1.1 實例功能概述 182
7.1.2 QFile讀寫文本文件 182
7.1.3 QFile和QTextStream結合讀寫文本文件 184
7.1.4 解決中文亂碼的問題 185
7.2 二進位文件讀寫 186
7.2.1 實例功能概述 186
7.2.2 Qt預定義編碼文件的讀寫 187
7.2.3 標準編碼文件的讀寫 192
7.3 文件目錄操作 197
7.3.1 文件目錄操作相關的類 197
7.3.2 實例概述 197
7.3.3 QCoreApplication類 199
7.3.4 QFile類 199
7.3.5 QFileInfo類 200
7.3.6 QDir類 201
7.3.7 QTemporaryDir和
QTemporaryFile 203
7.3.8 QFileSystemWatcher類 203
第8章 繪圖 206
8.1 QPainter基本繪圖 206
8.1.1 QPainter繪圖系統 206
8.1.2 QPen的主要功能 209
8.1.3 QBrush的主要功能 210
8.1.4 漸變填充 212
8.1.5 QPainter繪製基本圖形元件 214
8.2 坐標系統和坐標變換 217
8.2.1 坐標變換函數 217
8.2.2 坐標變換繪圖實例 218
8.2.3 視口和窗口 221
8.2.4 繪圖疊加的效果 223
8.3 Graphics View繪圖架構 224
8.3.1 場景、視圖與圖形項 224
8.3.2 Graphics View的坐標系統 226
8.3.3 Graphics View相關的類 227
8.3.4 Graphics View程序基本結構和功能實現 229
8.3.5 Graphics View繪圖程序實例 235
第9章 Qt Charts 247
9.1 Qt Charts概述 247
9.1.1 Qt Charts模塊 247
9.1.2 一個簡單的QChart繪圖程序 248
9.1.3 圖表的主要組成部分 249
9.2 QChart繪製折線圖 253
9.2.1 實例功能 253
9.2.2 主窗口類定義和初始化 253
9.2.3 畫筆設置對話框QWDialogPen 256
9.2.4 QChart的設置 257
9.2.5 QLineSeries序列的設置 259
9.2.6 QValueAxis坐標軸的設置 261
9.3 各種常見圖表的繪製 263
9.3.1 實例功能概述 263
9.3.2 數據準備 264
9.3.3 柱狀圖 267
9.3.4 餅圖 270
9.3.5 堆疊柱狀圖 273
9.3.6 百分比柱狀圖 274
9.3.7 散點圖和光滑曲線圖 276
9.4 圖表的其他操作 277
9.4.1 實例功能概述 277
9.4.2 自定義QWChartView類 278
9.4.3 主窗口類的設計 280
9.4.4 實時顯示光標處的數值 281
9.4.5 QLegendMarker的使用 282
9.4.6 圖表的縮放 283
第 10章 Data Visualization 284
10.1 Data Visualization模塊概述 284
10.2 三維柱狀圖 285
10.2.1 實例功能 285
10.2.2 主窗口設計 286
10.2.3 三維柱狀圖的創建 287
10.2.4 三維柱狀圖屬性設置 289
10.3 三維散點圖 293
10.3.1 繪製三維散點圖 293
10.3.2 三維坐標軸的方向 296
10.3.3 散點形狀與大小 296
10.4 三維曲面繪圖 296
10.4.1 三維曲面圖 296
10.4.2 三維地形圖 301
第 11章 資料庫 305
11.1 Qt SQL模塊概述 305
11.1.1 Qt SQL支持的資料庫 305
11.1.2 SQLite資料庫 306
11.1.3 Qt SQL模塊的主要類 308
11.2 QSqlTableModel的使用 309
11.2.1 實例功能 309
11.2.2 主窗口設計 310
11.2.3 打開數據表 311
11.2.4 添加、插入與刪除記錄 319
11.2.5 保存與取消修改 319
11.2.6 設置和清除照片 320
11.2.7 數據記錄的遍歷 321
11.2.8 記錄排序 322
11.2.9 記錄過濾 322
11.3 QSqlQueryModel的使用 323
11.3.1 QSqlQueryModel功能概述 323
11.3.2 使用QSqlQueryModel實現數據查詢 323
11.4 QSqlQuery的使用 327
11.4.1 QSqlQuery基本用法 327
11.4.2 QSqlQueryModel和QSqlQuery聯合使用 328
11.5 QSqlRelationalTableModel的使用 336
11.5.1 關係型數據表和實例功能 336
11.5.2 關係型數據模型功能實現 338
第 12章 自定義插件和庫 340
12.1 自定義Widget組件 340
12.1.1 自定義Widget子類QmyBattery 340
12.1.2 自定義Widget組件的使用 343
12.2 自定義Qt Designer插件 344
12.2.1 創建Qt Designer Widget插件項目344
12.2.2 插件項目各文件的功能實現 346
12.2.3 插件的編譯與安裝 349
12.2.4 使用自定義插件 350
12.2.5 使用MSVC編譯器輸出中文的問題 352
12.3 創建和使用靜態連結庫 353
12.3.1 創建靜態連結庫 353
12.3.2 靜態連結庫的使用 354
12.4 創建和使用共享庫 357
12.4.1 創建共享庫 357
12.4.2 使用共享庫 358
第 13章 多線程 362
13.1 QThread創建多線程程序 362
13.1.1 QThread類功能簡介 362
13.1.2 擲骰子的線程QDiceThread 363
13.1.3 擲骰子的多線程應用程式 365
13.2 線程同步 367
13.2.1 線程同步的概念 367
13.2.2 基於互斥量的線程同步 368
13.2.3 基於QReadWriteLock的線程同步 371
13.2.4 基於QWaitCondition的線程同步 373
13.2.5 基於信號量的線程同步 377
第 14章 網絡編程 383
14.1 主機信息查詢 383
14.1.1 QHostInfo和QNetworkInterface類 383
14.1.2 QHostInfo的使用 384
14.1.3 QNetworkInterface的使用 386
14.2 TCP通信 388
14.2.1 TCP通信概述 388
14.2.2 TCP伺服器端程序設計 390
14.2.3 TCP客戶端程序設計 395
14.3 QUdpSocket實現UDP通信 397
14.3.1 UDP通信概述 397
14.3.2 UDP單播和廣播 398
14.3.3 UDP組播 402
14.4 基於HTTP協議的網絡應用程式 405
14.4.1 實現高層網絡操作的類 405
14.4.2 基於HTTP協議的網絡文件下載 406
第 15章 多媒體 409
15.1 Qt多媒體模塊功能概述 409
15.2 音頻播放 410
15.2.1 使用QMediaPlayer播放音樂文件 410
15.2.2 使用QSoundEffect和Qsound播放音效文件 415
15.3 音頻輸入 415
15.3.1 使用QAudioRecorder錄製音頻 415
15.3.2 使用QAudioInput獲取音頻輸入 421
15.4 視頻播放 428
15.4.1 在QVideoWidget上播放視頻 428
15.4.2 在QGraphicsVideoItem上播放視頻 431
15.5 攝像頭的使用 433
15.5.1 攝像頭控制概述 433
15.5.2 實例主窗口設計與初始化 435
15.5.3 QCamera對象創建與控制 436
15.5.4 QCameraImageCapture抓取靜態圖片 438
15.5.5 QMediaRecorder視頻錄製 439
第 16章 應用程式設計輔助功能 441
16.1 多語言界面 441
16.1.1 多語言界面設計概述 441
16.1.2 tr()函數的使用 441
16.1.3 生成語言翻譯文件 442
16.1.4 使用Qt Linguist翻譯ts文件 443
16.1.5 調用翻譯文件改變界面語言 444
16.2 使用樣式表自定義界面 446
16.2.1 Qt樣式表 446
16.2.2 Qt樣式表句法 447
16.2.3 樣式表的使用 453
16.3 使用QStyle設置界面外觀 455
16.3.1 QStyle的作用 455
16.3.2 Qt內置樣式的使用 456
16.4 Qt應用程式的發布 457
16.4.1 應用程式發布方式 457
16.4.2 Windows平臺上的應用程式發布 458
關注小慄同學,關注小慄微言。