首页 Qt Qt5 新特性

Qt5 新特性

9 2

Qt 5 已经临近发布,其最大的特点就是模块化。将原来庞大的模块更细分为不同的部分,同时,一个大版本的升级,当然少不了添加、删除各个功能类。文本简单介绍 Qt5 的特性,其具体内容来自 Qt5 官方 Wiki 的介绍

前面说过,Qt5 最大的特性在于模块化。这么多的模块,Qt5 统称为 Qt Essentials。下面就来看看这些模块究竟是什么吧!注意,有些模块没有在这里列出,例如 SQL 等。请在这里查看完整的 Qt5 模块列表。

【2012年10月30日】重要更新

根据 QTBUG-27736 做出的决定,以下模块将从 Qt 5 中移除。“移除”的含义是,这些模块将不属于 Qt 5 的一部分,但是可能会作为额外的附加功能提供。这些模块是:

  • qt3d
  • qtconnectivity
  • qtfeedback
  • qtlocation
  • qtpim
  • qtsensors
  • qtsystems
  • qtwayland

因此,在阅读本文其它部分时,请注意这项最新修改!

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 新增了一系列新的类,其中最重要的是QWindowQScreenQSurfaceFormatQOpenGLContext。这些都作为 QtWidgets 模块的后端,以及直接供 QtQuick 2 使用。

等价于 Qt4 的 QtOpenGL 模块的一系列类

在 Qt 4 的 QtOpenGL 模块中最有用的类被移动到 QtGui 模块中了,例如QOpenGLFramebufferObjectQOpenGLShaderProgramQOpenGLFunctions等等。

用于替换QGLContextQOpenGLContext则更为通用,从QWindow中分离出来,支持更多用例,例如为不同界面使用相同上下文。

QOpenGLPaintDevice

我们没有将QWindowQOpenGLFramebufferObject作为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::AnyQTcpServerQUdpSocket可以同时支持 IPv4 和 IPv6 连接。

QHostAddress::AnyIPv4QHostAddress::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 贡献了很多代码。像QMatrix4x4QGLShaderProgramQVector3D这些类,都是来自 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)的支持。
  • QObject可以为这些类型定义Q_PROPERTY,这样就可以直接在 JavaScript 中进行访问。

Canvas

新增类似 HTML5 canvas API 的对象Canvas,提供几点增强:

  • 支持 2 种渲染目标:Canvas.ImageCanvas.FramebufferObject
  • 支持后台线程渲染
  • 支持 canvas 层叠渲染

Canvas 支持大多数 HTML5 context2d API,具体细节可以查看 canvas 文档。

粒子系统

QtQuick.Particles 2.0 模块包含了可以组成 2D 粒子的元素。

元素 API/行为 的改变

  • 新增SpriteImage元素,用于渲染动画精灵,可以通过动画改变,它使用 Sprite 元素表现每一帧动画。
  • MouseArea新增可以专递给 pressed 事件clickeddoubleClickedpressAndHold等不同类型。其顺序是在具有处理器的MouseArea中从上往下传递。你也可以在处理函数中忽略这些事件,让它们继续传递。这种行为通过新的属性propagateComposedEvents触发。
  • 绑定元素新增可以作为值来源使用;如果它的when属性为 false 时,也会保存任意早期的绑定。
  • Flickable:增加draggingdraggingHorizontallydraggingVerically属性。新增topMarginbottomMarginleftMarginrightMarginxOriginyOrigin属性。
  • Image新增两个属性:horizontalAlignmentverticalAlignment。新增fillMode一个合法值Image.Pad,表示不改变图像形状。设置 ImagesourceSize.widthsourceSize.height会将图像显示为指定大小,保持长宽比。
  • Grid增加rowSpacingcolumnSpacing属性。positioner 的spacing属性类型由整型改为浮点型。
  • positioner(RowColumnGridFlow)的改进:
    • 为 add 和 move 使用的过渡改进功能:可以访问ViewTransition属性,可以使用任意属性作为动画(不仅仅是位置)。
    • positioner 中的 item 现在具有附加属性,用于定位子元素位置:Positioner.indexPositioner.isFirstItemPositioner.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
  • TextEdittextFormat属性的默认值为PlainText而不是AutoText
  • TextInput增加wrapModeverticalAlignment属性,同时positionAt函数增加一个 y 参数。
  • PathView增加currentItemmaximumFlickVelocity属性。
  • ListViewGridView的改进:
    • 当元素在 view 中增加、删除或移动时,可以应用特殊的变换。
    • 增加headerItemfooterItem属性(实例化为 header 和 footer)。
    • RightToLeft布局下,preferredHighlightBegin/End 同样倒转。
    • ListView增加 section.labelPositioning 属性,允许将当前 section label 保持在 view 的开始处或将下一 section label 保持在 view 的结尾处。
  • 新增用于构建路径的PathArcPathCurvePathSvg

QtQuick 1 作为独立的库和模块

使用 QtQuick 1 的特定 API 编写 C++ 应用程序,例如QDeclarativeViewQDeclarativeItem必须在 .pro 文件中添加 quick1 模块,例如QT += quick1

QDeclarativeViewQDeclarativeItem头文件现在位于 QtQuick 1模块,例如:

#include <QtQuick1/QDeclarativeView>
#include <QtQuick1/QDeclarativeItem>

9 评论

紫夜逸风 2012年5月31日 - 10:37

正在看Quick1.1.。。。。。
不知道是否等到2.0稳定版出来之后再继续哎。、
版本更新太麻烦了

回复
DevBean 2012年6月3日 - 07:56

如果感兴趣,也可以继续 1.1 的学习,毕竟细节有所改变,但语法之类是不会有大的变化的。即便是学习 1.1,再学习 2.0 也会简单很多。学习 1.1 最大的优势之一是,你现在就可以着手,而不需要为了学习 2.0,必须自己编译 QtQuick。

回复
zhangruihuai 2013年11月9日 - 20:32

不知道豆子兄对Qt3D模块有无研究?貌似还没找到相关的例子……

回复
豆子 2013年11月10日 - 08:28

目前还没有看过 Qt3D。Qt3D 现在还没有跟随 Qt5 打包发布,digia 貌似已经砍掉了整个项目组…

回复
zhangruihuai 2013年11月11日 - 09:03

好可惜……Qt3D貌似挺好用的样子……

回复

发表评论

关于我

devbean

devbean

豆子,生于山东,定居南京。毕业于山东大学软件工程专业。软件工程师,主要关注于 Qt、Angular 等界面技术。

主题 Salodad 由 PenciDesign 提供 | 静态文件存储由又拍云存储提供 | 苏ICP备13027999号-2