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>