#(1):Qt 簡介
Qt 是一個著名的 C++ 應用程序框架。你并不能說它只是一個 GUI 庫,因為 Qt 十分龐大,并不僅僅是 GUI 組件。使用 Qt,在一定程度上你獲得的是一個“一站式”的解決方案:不再需要研究 STL,不再需要 C++ 的,不再需要到處去找解析 XML、連接數據庫、訪問網絡的各種第三方庫,因為 Qt 自己內置了這些技術。
Qt 是一個跨平臺的框架。跨平臺 GUI 通常有三種實現策略:
1. **API 映射**:API 映射是說,界面庫使用同一套 API,將其映射到不同的底層平臺上面。大體相當于將不同平臺的 API 提取公共部分。比如說,將 Windows 平臺上的按鈕控件和 Mac OS 上的按鈕組件都取名為 Button。當你使用 Button 時,如果在 Windows 平臺上,則編譯成按鈕控件;如果在 Mac OS 上,則編譯成按鈕組件。這么做的好處是,所有組件都是原始平臺自有的,外觀和原生平臺一致;缺點是,編寫庫代碼的時候需要大量工作用于適配不同平臺,并且,只能提取相同部分的 API。比如 Mac OS 的文本框自帶拼寫檢測,但是 Windows 上面沒有,則不能提供該功能。這種策略的典型代表是 wxWidgets。這也是一個標準的 C++ 庫,和 Qt 一樣龐大。它的語法看上去和 MFC 類似,有大量的宏。據說,一個 MFC 程序員可以很容易的轉換到 wxWidgets 上面來。
2. **API 模擬**:前面提到,API 映射會“缺失”不同平臺的特定功能,而 API 模擬則是解決這一問題。不同平臺的有差異 API,將使用工具庫自己的代碼用于模擬出來。按照前面的例子,Mac OS 上的文本框有拼寫檢測,但是 Windows 的沒有。那么,工具庫自己提供一個拼寫檢測算法,讓 Windows 的文本框也有相同的功能。API 模擬的典型代表是 wine —— 一個 Linux 上面的 Windows 模擬器。它將大部分 Win32 API 在 Linux 上面模擬了出來,讓 Linux 可以通過 wine 運行 Windows 程序。由此可以看出,API 模擬最大優點是,應用程序無需重新編譯,即可運行到特定平臺上。另外一個例子是微軟提供的 DirectX,這個開發庫將屏蔽掉不同顯卡硬件所提供的具體功能。使用這個庫,你無需擔心硬件之間的差異,如果有的顯卡沒有提供該種功能,SDK 會使用軟件的方式加以實現。*(關于舉例,可以參考文末一段精彩的討論。)*
3. **GUI 模擬**:任何平臺都提供了圖形繪制函數,例如畫點、畫線、畫面等。有些工具庫利用這些基本函數,在不同繪制出自己的組件,這就是 GUI 模擬。GUI 模擬的工作量無疑是很大的,因為需要使用最基本的繪圖函數將所有組件畫出來;并且這種繪制很難保證和原生組件一模一樣。但是,這一代價帶來的優勢是,可以很方便的修改組件的外觀——只要修改組件繪制函數即可。很多跨平臺的 GUI 庫都是使用的這種策略,例如 gtk+(這是一個 C 語言的圖形界面庫。使用 C 語言很優雅地實現了面向對象程序設計。不過,這也同樣帶來了一個問題——使用大量的類型轉換的宏來模擬多態,并且它的函數名一般都比較長,使用下劃線分割單詞,看上去和 Linux 如出一轍。gtk+ 并不是模擬的原生界面,而有它自己的風格,所以有時候就會和操作系統的界面格格不入。),Swing 以及我們的 Qt。
Qt 和 wxWidgets 一樣,也是一個標準的 C++ 庫。但是它的語法類似于 Java 的 Swing,十分清晰,而且使用信號槽(signal/slot)機制,讓程序看起來很明白——這也是很多人優先選擇 Qt 的一個很重要的原因。不過,所謂“成也蕭何,敗也蕭何”。這種機制雖然很清楚,但是它所帶來的后果是你需要使用 Qt 的 moc 對程序進行預處理,才能夠再使用標準的 make 或者 nmake 進行正常的編譯,并且信號槽的調用要比普通的函數調用慢大約一個數量級(Qt 4 文檔中說明該數據,但 Qt 5 尚未有官方說明)。Qt 的界面也不是原生風格的,盡管 Qt 使用 style 機制十分巧妙地模擬了原生界面。另外值得一提的是,Qt 不僅僅能夠運行在桌面環境中,還可以運行在嵌入式平臺以及手機平臺。
Qt 第一版于 1991 年由 Trolltech (奇趣科技)發布。后來在 2008 年,Nokia 斥資 1.5 億美元收購 TrollTech,將 Qt 應用于?Symbian 程序開發。2012 年 8 月 9 日,Nokia 將 Qt 以 400 萬歐元的價格出售給 Digia。
伴隨著 Qt,一直有兩種授權協議:商業授權以及開源授權。在 Qt 的早期版本,商業授權包含一些開源授權不提供的組件,但是在近期版本則不存在這個問題。以往人們對 Qt 的開源授權多有詬病。早期版本的 Qt 使用與 GPL 不兼容的協議授權,這直接導致了 KDE 與 GNOME 的戰爭(由于 Linux 使用 GPL 協議發布,GPL 協議具有傳染性,作為 Linux 桌面環境的 KDE 卻是基于與 GPL 不兼容的 Qt 開發,這就不遵守 GPL 協議)。不過,現在 Qt 的開源版本使用的是 GPLv3 以及 LGPL 協議。這意味著,你可以將 Qt 作為一個庫連接到一個閉源軟件里面。可以說,Qt 協議的爭議已經不存在了。
- (1)序
- (2)Qt 簡介
- (3)Hello, world!
- (4)信號槽
- (5)自定義信號槽
- (6)Qt 模塊簡介
- (7)MainWindow 簡介
- (8)添加動作
- (9)資源文件
- (10)對象模型
- (11)布局管理器
- (12)菜單欄、工具欄和狀態欄
- (13)對話框簡介
- (14)對話框數據傳遞
- (15)標準對話框 QMessageBox
- (16)深入 Qt5 信號槽新語法
- (17)文件對話框
- (18)事件
- (19)事件的接受與忽略
- (21)事件過濾器
- (22)事件總結
- (23)自定義事件
- (24)Qt 繪制系統簡介
- (25)畫刷和畫筆
- (26)反走樣
- (27)漸變
- (28)坐標系統
- (29)繪制設備
- (30)Graphics View Framework
- (31)貪吃蛇游戲(1)
- (32)貪吃蛇游戲(2)
- (33)貪吃蛇游戲(3)
- (34)貪吃蛇游戲(4)
- (35)文件
- (36)二進制文件讀寫
- (37)文本文件讀寫
- (38)存儲容器
- (39)遍歷容器
- (40)隱式數據共享
- (41)model/view 架構
- (42)QListWidget、QTreeWidget 和 QTableWidget
- (43)QStringListModel
- (44)QFileSystemModel
- (45)模型
- (46)視圖和委托
- (47)視圖選擇
- (48)QSortFilterProxyModel
- (49)自定義只讀模型
- (50)自定義可編輯模型
- (51)布爾表達式樹模型
- (52)使用拖放
- (53)自定義拖放數據
- (54)剪貼板
- (55)數據庫操作
- (56)使用模型操作數據庫
- (57)可視化顯示數據庫數據
- (58)編輯數據庫外鍵
- (59)使用流處理 XML
- (60)使用 DOM 處理 XML
- (61)使用 SAX 處理 XML
- (62)保存 XML
- (63)使用 QJson 處理 JSON
- (64)使用 QJsonDocument 處理 JSON
- (65)訪問網絡(1)
- (66)訪問網絡(2)
- (67)訪問網絡(3)
- (68)訪問網絡(4)
- (69)進程
- (70)進程間通信
- (71)線程簡介
- (72)線程和事件循環
- (73)Qt 線程相關類
- (74)線程和 QObject
- (75)線程總結
- (76)QML 和 QtQuick 2
- (77)QML 語法
- (78)QML 基本元素
- (79)QML 組件
- (80)定位器
- (81)元素布局
- (82)輸入元素
- (83)Qt Quick Controls
- (84)Repeater
- (85)動態視圖
- (86)視圖代理
- (87)模型-視圖高級技術
- (88)Canvas
- (89)Canvas(續)