天天看點

Qt5 新特性

Qt Core 類似于 Qt4 中的 QtCore 子產品,包含了所有非 GUI 的功能。所有其他的 Qt 子產品都基于這個子產品。與 Qt4 的 QtCore 不同之處在于,Qt Core 還包括了 XML 等 Qt4 中存在的部分。

QMimeDatabase 提供了判斷給定檔案或記憶體區塊的 mimetype 的功能,原理是通過擴充名和(或)内容資訊。

MIME 類型資料庫由 freedesktop.org 的 shared-mime-info 項目提供。如果在目前系統上找不到 MIME 類型資料庫(例如在大多數 Windows 或 Mac OS X 系統上),Qt 則使用自己的拷貝。

QtCore 現在包含了一系列用于解析和生成 JSON 文檔的類。這些類允許你在 JSON 的記憶體二進制表現形式和标準文本之間進行互相轉換。這些類的目的當然就是提供 JSON 格式的支援。

QObject 現在支援一種額外的文法,可以支援在編譯期對信号槽的連接配接進行檢查,比如 signal 和 接受者是否都存在、參數是否比對等。目前我們使用 C++ 模闆實作了這一功能,不過當 C++11 獲得全面支援之後,使用 C++11 新特性更為友善。

這種新文法允許将一個信号連接配接到任意 C++ 接受者上,包括 C++11 lambda 表達式,成員函數以及 static 函數。這些接受者不必非得聲明為 slots。

Qt5 新增加一個新的類 QRegularExpression,提供相容 Perl 的正規表達式。這個類比 QRegExp 更強大,速度更快,支援更多特性,例如 lazy 和 possessive 謂詞、lookbehinds、具名捕獲組 named capturing groups 和循環比對。

QtGui 新增了一系列新的類,其中最重要的是 QWindow,QScreen,QSurfaceFormat 和 QOpenGLContext。這些都作為 QtWidgets 子產品的後端,以及直接供 QtQuick 2 使用。

在 Qt 4 的 QtOpenGL 子產品中最有用的類被移動到 QtGui 子產品中了,例如 QOpenGLFramebufferObject、QOpenGLShaderProgram、QOpenGLFunctions 等等。

用于替換 QGLContext 的 QOpenGLContext 則更為通用,從 QWindow 中分離出來,支援更多用例,例如為不同界面使用相同上下文。

我們沒有将 QWindow 和 QOpenGLFramebufferObject 作為 QPaintDevice 的子類,而是提供了一個新的 QOpenGLPaintDevice 類,使得可以使用 QPainter 渲染目前邊界的上下文更簡單和靈活。

現在,使用 Qt5 提供的 QDnsLookup API 可以查詢 DNS 記錄了。這個類并不是為了替換掉 QHostInfo,後者仍然具有根據 IP 位址擷取主機名的 API。QDnsLookup 更主要的是用于其它形式的 DNS 記錄,例如 SRV、TXT 以及 MX。這實際上是替代了已經被廢棄的 Q3Dns API。

許多應用程式使用主機名和網絡層的透明協定來提供對 IPv6 的透明支援。綁定到 QHostAddress::Any 的 QTcpServer 和 QUdpSocket 可以同時支援 IPv4 和 IPv6 連接配接。

QHostAddress::AnyIPv4 和 QHostAddress::AnyIPv6 則提供了單一協定的支援。使用 QNetworkAccessManager 的外出連接配接則會同時嘗試 IPv4 和 IPv6,直到有一個成功了。這将會幫助開發某一環境下某種協定受限情況下的程式開發。

QTcpSocket 現在可以在連接配接前綁定到某一 IP 位址,這使得在多穴環境下限制連接配接到特定接口成為可能。

Qt5 移除了 QHttp API,原因是功能重複。QNetworkAccessManager 足以提供類似的功能。

Qt5 移除了 QFtp API,原因是其實作品質。QNetworkAccessManager 可以用來提供 ftp url 的上傳下載下傳操作。

這些 API 将由某一易于遷移的獨立形式提供。

Qt5 增加了通路 SSL 認證的擴充,這将友善 Qt 架構開發人員,同時作為未來的 Qt SSL 支援的基礎。

Qt5 增加了對 SSL 證書的驗證工具鍊,而不僅僅是當連接配接到 SSL 伺服器時才進行的操作。

Qt5 增加了對 buggy SSL 伺服器的支援。這些修改現在已經被添加到了 Qt 4.8。

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 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 2.0 是一個重大更新。

QtQuick 2 基于 OpenGL 場景。下面的類直接替換掉 QtQuick 1 中的同名類:

QQuickView

QQuickCanvas

QQuickItem

QQuickPaintedItem

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 中進行通路。

新增類似 HTML5 canvas API 的對象 Canvas,提供幾點增強:

支援 2 種渲染目标:Canvas.Image 和 Canvas.FramebufferObject

支援背景線程渲染

支援 canvas 層疊渲染

Canvas 支援大多數 HTML5 context2d API,具體細節可以檢視 canvas 文檔。

QtQuick.Particles 2.0 子產品包含了可以組成 2D 粒子的元素。

新增 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 的特定 API 編寫 C++ 應用程式,例如 QDeclarativeView 或 QDeclarativeItem 必須在 .pro 檔案中添加 quick1 子產品,例如 QT += quick1。

QDeclarativeView 和 QDeclarativeItem 頭檔案現在位于 QtQuick 1子產品,例如: