Qt 5 已經臨近發布,其最大的特點就是模塊化。將原來龐大的模塊更細分為不同的部分,同時,一個大版本的升級,當然少不了添加、刪除各個功能類。文本簡單介紹 Qt5 的特性,其具體內容來自 Qt5 官方 Wiki 的介紹 。
前面說過,Qt5 最大的特性在於模塊化。這么多的模塊,Qt5 統稱為 Qt Essentials。下面就來看看這些模塊究竟是什么吧!注意,有些模塊沒有在這里列出,例如 SQL 等。請在 這里 查看完整的 Qt5 模塊列表。
Qt Core
Qt Core 類似於 Qt4 中的 QtCore 模塊,包含了所有非 GUI 的功能。所有其他的 Qt 模塊都基於這個模塊。與 Qt4 的 QtCore 不同之處在於,Qt Core 還包括了 XML 等 Qt4 中存在的部分。
QStandardPaths
QStandardPaths 是 Qt4 的 QDesktopServices 的增強版,其 API 大部分基於 KDE4 的 KStandardDirs 。這個類提供了比 QDesktopServices 更多的功能,例如在某一存儲位置搜索給定文件等。
MimeTypes
QMimeDatabase 提供了判斷給定文件或內存區塊的 mimetype 的功能,原理是通過擴展名和(或)內容信息。
MIME 類型數據庫由 freedesktop.org 的 shared-mime-info 項目提供。如果在當前系統上找不到 MIME 類型數據庫(例如在大多數 Windows 或 Mac OS X 系統上),Qt 則使用自己的拷貝。
JSON 支持
QtCore 現在包含了一系列用於解析和生成 JSON 文檔的類。這些類允許你在 JSON 的內存二進制表現形式和標准文本之間進行相互轉換。這些類的目的當然就是提供 JSON 格式的支持。
編譯器檢查 signal-slot 連接
QObject 現在支持一種額外的語法,可以支持在編譯期對信號槽的連接進行檢查,比如 signal 和 接受者是否都存在、參數是否匹配等。目前我們使用 C++ 模板實現了這一功能,不過當 C++11 獲得全面支持之后,使用 C++11 新特性更為方便。
這種新語法允許將一個信號連接到任意 C++ 接受者上,包括 C++11 lambda 表達式,成員函數以及 static 函數。這些接受者不必非得聲明為 slots。
如果感興趣,可以參考 這篇文章 獲取更多信息。
兼容 Perl 的正則表達式
Qt5 新增加一個新的類 QRegularExpression,提供兼容 Perl 的正則表達式。這個類比 QRegExp 更強大,速度更快,支持更多特性,例如 lazy 和 possessive 謂詞、lookbehinds、具名捕獲組 named capturing groups 和循環匹配。
Qt Gui
窗口和渲染的新的類
QtGui 新增了一系列新的類,其中最重要的是 QWindow,QScreen,QSurfaceFormat 和 QOpenGLContext。這些都作為 QtWidgets 模塊的后端,以及直接供 QtQuick 2 使用。
等價於 Qt4 的 QtOpenGL 模塊的一系列類
在 Qt 4 的 QtOpenGL 模塊中最有用的類被移動到 QtGui 模塊中了,例如 QOpenGLFramebufferObject、QOpenGLShaderProgram、QOpenGLFunctions 等等。
用於替換 QGLContext 的 QOpenGLContext 則更為通用,從 QWindow 中分離出來,支持更多用例,例如為不同界面使用相同上下文。
QOpenGLPaintDevice
我們沒有將 QWindow 和 QOpenGLFramebufferObject 作為 QPaintDevice 的子類,而是提供了一個新的 QOpenGLPaintDevice 類,使得可以使用 QPainter 渲染當前邊界的上下文更簡單和靈活。
Qt Network
QDnsLookup
現在,使用 Qt5 提供的 QDnsLookup API 可以查詢 DNS 記錄了。這個類並不是為了替換掉 QHostInfo,后者仍然具有根據 IP 地址獲取主機名的 API。QDnsLookup 更主要的是用於其它形式的 DNS 記錄,例如 SRV、TXT 以及 MX。這實際上是替代了已經被廢棄的 Q3Dns API。
改進對 IPv6 和 dual mode 網絡的支持
許多應用程序使用主機名和網絡層的透明協議來提供對 IPv6 的透明支持。綁定到 QHostAddress::Any 的 QTcpServer 和 QUdpSocket 可以同時支持 IPv4 和 IPv6 連接。
QHostAddress::AnyIPv4 和 QHostAddress::AnyIPv6 則提供了單一協議的支持。使用 QNetworkAccessManager 的外出連接則會同時嘗試 IPv4 和 IPv6,直到有一個成功了。這將會幫助開發某一環境下某種協議受限情況下的程序開發。
綁定 TCP socket
QTcpSocket 現在可以在連接前綁定到某一 IP 地址,這使得在多穴環境下限制連接到特定接口成為可能。
移除 QFtp 和 QHttp API
Qt5 移除了 QHttp API,原因是功能重復。QNetworkAccessManager 足以提供類似的功能。
Qt5 移除了 QFtp API,原因是其實現質量。QNetworkAccessManager 可以用來提供 ftp url 的上傳下載操作。
這些 API 將由某一易於遷移的獨立形式提供。
SSL 證書擴展
Qt5 增加了訪問 SSL 認證的擴展,這將方便 Qt 框架開發人員,同時作為未來的 Qt SSL 支持的基礎。
SSL 證書驗證
Qt5 增加了對 SSL 證書的驗證工具鏈,而不僅僅是當連接到 SSL 服務器時才進行的操作。
Buggy SSL 服務器的周邊工作
Qt5 增加了對 buggy SSL 服務器的支持。這些修改現在已經被添加到了 Qt 4.8。
支持 opaque Private Key
這使得應用程序可以從 PKCS#11 加密狗這樣的設備讀取 private key,參見http://git.iksaif.net/?p=qsslkey-p11.git;a=tree 。
Qt 3D
Qt 3D 是 Qt 5.0 新增模塊,雖然它在實驗室項目中已經存在好幾年,也向 Qt 貢獻了很多代碼。像 QMatrix4×4、QGLShaderProgram 和 QVector3D 這些類,都是來自 Qt 3D 項目的。Qt3D 基於 QML2 和 Qt OpenGL 的支持。
Qt3D 包含兩個庫:
- Qt3DQuick – 使用 QML 處理 3D 內容,基於 OpenGL
- Qt3D – 支持 Qt3DQuick 的 C++ 類,也可以直接使用
現在,Qt3D 包含:
- GL 渲染,包括基本的光照
- 3D 場景管理
- 加載 3D 資源,例如 .obj 和 .3ds 文件
- stock 形狀
- 幾何形狀的加載和管理
- 紋理和材質
- 簡單的幾何動畫
- camera 和 view
上面這些特性都由 QML API 提供。結合 QML 還可以:
- 創建內聯的或者從源文件加載陰影,自動綁定到 QML 屬性
- 使用 QML scoping 創建 3D 場景
- 將曲線動畫這種聲明式代碼同 3D 狀態結合在一起
Qt Location
Qt Location 是 Qt 5.0 新增模塊,雖然它幾年前就是 Qt Mobility 的一部分。相比於 Qt Mobility 提供的版本,Location API 則有下面的幾點改變:
- 現在的地圖是 QML2 場景圖的一部分,直接使用直接 OpenGL 的硬件渲染
- 使用 MapQuickItem 可以向地圖添加任意 QML2 item
- 基於 QML model 創建支持 model-view 的地圖對象
- 內置縮放手勢、剪切和加速度感應
- 大幅提升性能,特別是大地圖的多邊形和一般對象
- 支持旋轉和地址匹配的完整 QML API——兼容標准的 QML model-view 設計
- 不需要打開所有插件,即可檢查所有支持的特性
- 可以簡單設置的 PluginParameters 的適用於旋轉、地位、地圖的同意的“Plugin”QML 元素
- Landmarks API 被 Places API 取代:
- 提供相同功能的 C++ 和 QML API
- 支持查看更加豐富的內容(例如圖像、可編輯區域等)的新 API
- 支持本地化、搜索結果、同義詞的新 API
- 支持訪問 Places REST 服務的 REST 插件
- 支持保存本地書簽的 JsonDb 插件
鼠標輸入
支持游戲鼠標提供的額外按鍵
現在,很多游戲鼠標提供了遠多於左右鍵和滾輪的按鍵。Qt 應用程序可以接受來自更多鼠標按鍵的 Button 事件:在 XCB、XLIB 或 DirectFB 上達 27 個鼠標鍵;在 Wayland、Evdev 或 OS X 上達 16 個鼠標鍵;在 Blackberry/QNX 上達 8 個鼠標鍵。Qt 的 Windows 版本只能支持 5 個鼠標鍵,這是受 Windows 平台限制的。
QtQuick
QtQuick 2.0 是一個重大升級。
SceneGraph 渲染器
QtQuick 2 基於 OpenGL 場景。下面的類直接替換掉 QtQuick 1 中的同名類:
- QQuickView
- QQuickCanvas
- QQuickItem
- QQuickPaintedItem
改進 QML 引擎和語言
- JS 引擎改變為 V8。
- 處理器和編譯器優化。
- 新的綁定優化器。
- ValueType 改進:
- QColor 現在作為一個值類型。紅、綠、藍和 alpha 通道的值由 “r”、“g”、“b” 和 “a” 屬性獲得
- 改進對 QVector4D 的支持,現在在 QML 中可以使用 Qt.vector4d() 進行構建
- 通過 Module API 可以將任意功能放置在 namespace 中。參考 qmlRegisterModuleApi()。
- JavaScript (.js) 文件現在可以引入 QML 模塊以及其他 JavaScript 文件。
- 新增屬性類型 var,淘汰舊的 variant 屬性類型。var 類型的屬性可以保存 JavaScript 引用。
- QML 的屬性類型 var 和 variant 可以保存 pixmap。
- QQmlExpression 可以直接(更有效率)由 QQmlScriptString 構建。
- 改進對特定順序存儲類型(QList<int>、QList<qreal>、QList<bool>、QList<QUrl>、QList<QString> 和 QStringList)的支持。
- QObjects 可以為這些類型定義 Q_PROPERTY,這樣就可以直接在 JavaScript 中進行訪問。
Canvas
新增類似 HTML5 canvas API 的對象 Canvas,提供幾點增強:
- 支持 2 種渲染目標:Canvas.Image 和 Canvas.FramebufferObject
- 支持后台線程渲染
- 支持 canvas 層疊渲染
Canvas 支持大多數 HTML5 context2d API,具體細節可以查看 canvas 文檔。
粒子系統
QtQuick.Particles 2.0 模塊包含了可以組成 2D 粒子的元素。
元素 API/行為 的改變
- 新增 SpriteImage 元素,用於渲染動畫精靈,可以通過動畫改變,它使用 Sprite 元素表現每一幀動畫。
- MouseArea 新增可以專遞給 pressed 事件 clicked、doubleClicked 和 pressAndHold 等不同類型。其順序是在具有處理器的 MouseArea 中從上往下傳遞。你也可以在處理函數中忽略這些事件,讓它們繼續傳遞。這種行為通過新的屬性 propagateComposedEvents 觸發。
- 綁定元素新增可以作為值來源使用;如果它的 when 屬性為 false 時,也會保存任意早期的綁定。
- Flickable:增加 dragging、draggingHorizontally 和 draggingVerically 屬性。新增 topMargin、bottomMargin、leftMargin、rightMargin、xOrigin、yOrigin 屬性。
- Image 新增兩個屬性:horizontalAlignment 和 verticalAlignment。新增 fillMode 一個合法值 Image.Pad,表示不改變圖像形狀。設置 Image sourceSize.width 和 sourceSize.height 會將圖像顯示為指定大小,保持長寬比。
- Grid 增加 rowSpacing 和 columnSpacing 屬性。positioner 的 spacing 屬性類型由整型改為浮點型。
- positioner(Row、Column、Grid、Flow)的改進:
- 為 add 和 move 使用的過渡改進功能:可以訪問 ViewTransition 屬性,可以使用任意屬性作為動畫(不僅僅是位置)。
- positioner 中的 item 現在具有附件屬性,用於定位子元素位置:Positioner.index、Positioner.isFirstItem、Positioner.isLastItem。
- Loader 的改進:
- 增加 active 屬性,允許延遲 Loader 元素 item 屬性的實例化。
- 增加 setSource(JSObject) 函數,允許將屬性初始化為特定值(類似component.createObject())
- source 改變時發出 sourceChanged 信號;sourceComponent 改變時發出 sourceComponentChanged 信號。在前些版本,這兩個屬性任意一個改變時,都會同時發出這兩個信號。
- 增加 asynchronous 屬性,降低組件初始化時的卡頓。
- 如果 source 被設置為 asynchonous: true,則組件將會在后台線程編譯,
- Text 的改進:
- 每一次增加新的行,都會調用 onLineLaidOut 處理函數。這使得我們能夠改變行的位置和大小。
- 新政 doLayout 函數,用於從 JavaScript 觸發布局。
- 當 textFormat 設置為 AutoText 時,自動轉換為 StyledText 而不是 RichText,
- TextEdit – textFormat 屬性的默認值為 PlainText 而不是 AutoText。
- TextInput 增加 wrapMode 和 verticalAlignment 屬性,同時 positionAt 函數增加一個 y 參數。
- PathView 增加 currentItem 和 maximumFlickVelocity 屬性。
- ListView 和 GridView 的改進:
- 當元素在 view 中增加、刪除或移動時,可以應用特殊的變換。
- 增加 headerItem 和 footerItem 屬性(實例化為 header 和 footer)。
- 在 RightToLeft 布局下,preferredHighlightBegin/End 同樣倒轉。
- ListView 增加 section.labelPositioning 屬性,允許將當前 section label 保持在 view 的開始處或將下一 section label 保持在 view 的結尾處。
- 新增用於構建路徑的 PathArc、PathCurve、PathSvg。
QtQuick 1 作為獨立的庫和模塊
使用 QtQuick 1 的特定 API 編寫 C++ 應用程序,例如 QDeclarativeView 或 QDeclarativeItem 必須在 .pro 文件中添加 quick1 模塊,例如 QT += quick1。
QDeclarativeView 和 QDeclarativeItem 頭文件現在位於 QtQuick 1模塊,例如:
#include <QtQuick1/QDeclarativeView> #include <QtQuick1/QDeclarativeItem>
