Qt5 新特性

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>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Google Dart

为Flutter应用程序添加交互性 顶

你如何修改你的应用程序,使其对用户输入做出反应? 在本教程中,您将为仅包含非交互式小部件的应用添加交互性。 具体来说,您将通过创建一个管理两个无状态小部件的自定...

2242
来自专栏TechBox

跟着官方文档学习3D Touch前言(一)app外3D Touch—Home Screen Quick Actions(二)app内的3D Touch - Peek and Pop名词解释

2544
来自专栏一个会写诗的程序员的博客

bootstrap-table 前端分页,刷新事件代码实例

参考文档: http://bootstrap-table.wenzhixin.net.cn/

1.1K1
来自专栏IMWeb前端团队

可能是史上最全的weex踩坑攻略

> 这是一篇有故事的文章 --- 来自一个weex在生产环境中相爱相杀的小码畜.. ? 故事一: Build 虽然weex的口号是一次撰写 多端运行, 但其实b...

1.9K10
来自专栏王磊的博客

一些好用的开源控件

      工作两年,一直都在做些编码方面的表面功夫,实现了很多很炫的功能,在此写下一些体验。有些比较小的dll文件我会发上来,如果是开源组织的代码我会把地址附...

3836
来自专栏WindCoder

一个Angular 5教程:一步一步指导实现你的第一个Angular 5应用程序

现在我们可以app.component.html用这个替换:Angular是由Google开发的AngularJS框架的新版本。它带有一个完整的重写,以及各种改...

1.3K1
来自专栏淡定的博客

使用cropper实现图片裁剪功能并保存图片到数据库

5202
来自专栏挖掘大数据

Cobub无码埋点关键技术实现流程(附图)

随着大数据时代的到来,数据采集也已经变的越来越重要。前端埋点作为一个比较成熟的数据接入手段被广泛应用着。目前埋点分为两种方式,有码与无码埋点。有码埋点比较容易理...

2636
来自专栏数据结构与算法

My Vim

noip考完啦 不管成绩怎么样,以后不用Dev啦。 尝试一下传说中的Vim 我的Vim配置 Vim8.0 https://files.cnblogs.com/f...

6087
来自专栏lonelydawn的前端猿区

javascript生成.xls文件(兼容IE&Chrome&Firefox)

贴代码,一切尽在注释中 <html> <head> <meta charset="utf-8"> </head> <body> <input ...

1916

扫码关注云+社区

领取腾讯云代金券