跨平台的C++及UI开发库-Qt
2014-01-10 17:01:29 阿炯

Qt 是一个跨平台的C++图形用户界面应用程序框架,它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。广泛用于创建图形用户界面、嵌入式系统和移动应用等;完全面向对象、易扩展,并且允许真正地组件编程。采用GPLLGPL、QPL多协议授权。

Qt is a cross-platform application and UI framework for developers using C++ or QML, a CSS & JavaScript like language. Qt Creator is the supporting Qt IDE.


Qt使用标准的C++和特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏。通过语言绑定,其他的编程语言也可以使用Qt。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西,但是 Qt 具有下列优点:

优良的跨平台特性 Qt支持下列操作系统: Microsoft Windows 9x、2k,Linux,Solaris,HP-UX,Digital UNIX (OSF/1,Tru64),Irix,FreeBSD,BSD/OS,AIX,OS390,QNX 等等。

面向对象 Qt 的良好封装机制使得 Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常 方便的。 Qt 提供了一种称为 signals/slots 的安全类型来替代 callback,这使得各个元件 之间的协同工作变得十分简单。

丰富的 API Qt 包括多达 250 个以上的 C++ 类,还替供基于模板的 collections, serialization, file, I/O device, directory management, date/time 类。甚至还包括正则表达式的处理 功能。

支持图形渲染及OpenGL

大量的开发文档

XML 支持


更多关于其特性介绍,请参考这里

自从 1996 年早些时候,Qt 进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础;Qt 也是流行的 Linux 桌面环境 KDE 的基础,KDE 是所有主要的 Linux 发行版的一个标准组件。

Qt 最初是由芬兰的 TrollTech 开发的,后来卖给了诺基亚(就是曾经是著名的手机巨头诺基亚)。 2012 年,Digia 完全从诺基亚手中收购了 QT 的技术平台和知识产权。QT 背后总是得到商业公司的支持。它追求双重许可策略,一个是商业版本,另一个是免费版本。这种策略严重限制了 Qt 的用户基础,据说诺基亚在收购后已经意识到了这个问题。从 4.5 版开始,LGPL 被采用,开发人员可以基于免费的 Qt 库发布商业软件。

由于 Qt 使用非标准的 C++,因此与其他库的兼容性会出现问题,并且每个平台上的图形界面都不完全是本机 GUI,而是仅通过主题模拟系统上的标准 GUI。看起来非常相似,但是在某些地方存在明显的缺陷。Qt 执行缓慢且过大是另一个问题。另外 Qt 提供了一系列完整的文档和 RAD 工具,并提供了最完整的平台支持以及对移动终端的最完整支持。在所有 GUI 工具库中,Qt 库也是面向对象最稳定的。


发展历程

1990年 Qt 由 Haavard Nord 和 Eirik Chambe-Eng 在挪威特隆赫姆的公园长椅上构思;
1994年两人创立了Troll Tech(奇趣科技);
1995年 Troll Tech 于 5 月 20 日第一次公开发布Qt 0.90,用于 X11/Linux 。商业和开源(Free Qt 许可证);
1996年Qt 1.0发布,是当前流行的Linux桌面环境KDE的基础;
1998年Netscape5.0从Motif移植到Qt上,KDE Free Qt基金会成立,KDE/GNOME 1.0发布,保证 Qt 可用于自由软件开发;
1999年Qt2.0~2.2发布,Qt Free Edition开始使用GPL;
2000年嵌入式Qt (Qt/Embedded)发布;
2001 年Qt 3.0 发布,支持“多数据库环境、多语言、多显示器”,支持 Mac OS X 和新的 Qt Designer GUI 构建器;
2005年Qt 4.0发布,适用于所有平台甚至 Windows 的商业和 GPL 2.0(或更高版本)下的全面改造(又名兼容性中断);
2006年Troll Tech首次公开募股。GreenPhone 开发者智能手机。从夏普到摩托罗拉,全球数百万台设备采用Qt;
2008年Troll Tech被Nokia(诺基亚)收购,次年Qt源代码开放;
2009年 Qt Creator 推出,Qt 4.5 带来 LGPL v2.1;
2010 年Qt Quick 推出,Qt 4.7 中的 WebKit 集成和 Symbian 支持;
2012年诺基亚将全部Qt业务和知识产权出售给Digia公司;
2013年Digia发布了Qt 5.0,预建软件堆栈和Qt WebEngine;
2014年Digia成立子公司The Qt Company,专注于Qt技术的发展和拓展:发布跨平台的集成开发环境Qt Creator 3.1.0,同年5月发布Qt 5.3.0正式版,至此Qt实现了对iOS、Android、Windows PC端等平台的全面支持;
2015 年Qt第一次公开发布 20 周年,完成了一个 Qt 站点统一,全球 800K+ Qt 开发者;
2020年12月8日Qt 6.0发布,引入了许多新特性。


基本特性

⑴Qt的跨平台开发能力:
目标设备目标平台开发平台
计算机Windows,MacOS,桌面LinuxWindows,MacOS,桌面Linux
移动设备Android,iOS,手机windows桌面Linux,MacOS,Windows
嵌入式设备嵌入式linux,QNX,VxWorks, 嵌入式Windows桌面Linux,Windows
单片机FreeRTOS或无操作系统桌面Linux,Windows


⑵Qt的许可类型:

Qt的许可类型:商业许可:按年付费。模块更多,开发者可以不公开自己的源码。

开源许可:
①GPLv2/GPLv3许可:使用了GPL许可的Qt代码允许销售,但必须开源。GPLv3还要求公开硬件信息。
②LGPLv3许可:与GPL类似,但更宽松。若只是链接或调用GPL许可协议的Qt代码,可以不开源。

Qt近年来不太专一,Qml,Qt Quick等做了不少尝试,但这些新功能一直不温不火,有些模块做了又废弃了,比如Qt script,让模块繁多且复杂难用。

Qt商业授权不太友好,开发商业应用一定要谨慎,有公司为此付出了高额的版权费。个人开发者可以免费使用。Qt的免费版本不允许静态链接,会有版权上的限制,但开发者还是可以通过一些特殊的编译方法静态连接Qt的库的。

⑶Qt支持的开发语言:
C++和QML:
Qt对标准C++语言进行了扩展,引入了“信号”与“槽”等机制;
QML(Qt Meta Language)是用来描述应用程序界面的声明式脚本语言;
C++和QML可以混合使用。

⑷Qt6新特性:
2020年12月正式发布了Qt6.0,引入的主要新特性包括:
支持C++17标准;
Qt核心库的改动:新的数学和绑定系统,全面支持Unicode字符集,修改了Qlist的实现方式,将QVector类和Qlist类统一为Qlist类;
新的图形架构:Qt5中3D渲染依赖OpenGL,Qt6中引入了新的技术RHI(rendering hardware interface),它是一个抽象层,使得Qt可以使用平台本地化的3D图形API(Linux:Vulkan、Windows:Direct 3D、macOS:metal);
CMake构建系统:Qt6仍然支持QMake但建议使用CMake。
其他(多媒体、网络、Qt Quick 3D、Qt Design Studio等)。


最新版本:5.5
修复了 1500 个Bug,实现了大量的性能改进。同时还完善了跨平台功能,并且优化了多媒体和蓝牙方面的功能。

完善跨平台功能
Windows:Qt 5.5 做了很多努力来支持 Windows 10。从 Qt 5.3 开始就能在 Windows 8 新 WinRT APIs 的基础上运行,相信此版本能完全支持 Windows 10。
Linux:Linux 包现在已经能在 RedHat Enterprise Linux 上构建,支持更多的 Linux 发行版 (从 RHEL 6.6 到 Ubuntu 15.04)。
Mac OS X:同时也对 Mac OS X 平台方面做了大量的改进,当前使用苹果的安全传输层来允许 SSL 功能,支持蓝牙和 Bluetooth LE;支持 Qt WebView;修复了 Qt Multimedia 的大量问题。

主要改进
1. 简化产品架构,提供 3 个版本的 Qt:
应用开发版是商业版本,支持在所有桌面和移动平台创建应用。
设备创建版是是第二个商业版本,目标是嵌入式设备的创建,提供大量工具链。
开源版本是遵循 LGPL 2.1/3 或者 GPL 的开源版本

2. 新功能
跟往常一样,Qt 5.5 绑定了最新的 Qt Creator 版本,还有大量的新功能:
已经支持 Bluetooth LE API,提供在 Android,Mac OS X 和 iOS 或者是 Linux 现有的后端上;
添加了 2 个模块(Qt Canva 3D 和 Qt 3D)来扩展 3D APIs,完善图形工具包
新增模块 Qt Location(技术预览)
改进 Qt Quick、Multimedia
Qt WebEngine 更新至 Chromium 40 版本,添加了新 API 来管理下载文件,缓存控制,cookies 和设置

3. 废弃模块
Qt WebKit, Qt Quick 1 和 Qt Script;Qt 5.5 还会继续提供这些模块,但是强烈建议使用他们的替代品:Qt WebEngine, Qt Quick 和 Qt QML,这些能完全兼容 JavaScript 引擎。

更多内容请看发行说明

最新版本:6.0
2020年12月9日,Qt 6.0 正式发布了。该版本是 Qt 6 系列的第一个版本,旨在满足一些新的市场需求。官方表示,自 2012 年发布 Qt 5.0 以来,Qt 的用户群体和使用量都有巨大的增长。但是8年来,世界发生了重大变化,比如嵌入式系统中 Qt 的使用量猛增,C++不断发展,出现了新的 3D 图形 API 等。这些都是直接影响 Qt 发展迭代的因素。因此,官方称 Qt 6 的任务是使 Qt 成为未来的生产力平台。作为 Qt 的主要版本,Qt 6.0 是 Qt 5 系列的延续,提供了更高的'自由度',以实现新功能。Qt 6 的主要变化包括这些领域:
利用 C++ 17
采用下一代 QML
采用新的图形架构
Qt Quick 的统一 2D 和 3D
CMake 构建系统(应用程序仍支持 qmake)

在 Qt 6 中加入了一个与 C++ 17 兼容的编译器,以便在开发 Qt 时使用更现代的 C++ 语言构造,并允许在 API方面进行集成。

核心库和 API
作为 Qt 最核心部分的模块,Qt Core 本次更新遍历了许多领域并进行了改进,以下是一些最重要的变化:
新的属性和绑定系统:该系统现在带来了绑定的概念,这使得 QML 在 C++ 的 Qt 5 中取得了巨大的成功。
字符串和 Unicode:官方从 Qt 5 开始将 Qt 与 Unicode 完全对齐,但是 Qt 6 中还有一些问题需要整理解决。
QList 是一个在 Qt 5 中经常被批评的类,因为它是堆分配存储在其中的对象的对象,该对象大于指针,从而给堆分配方法带来压力。在 Qt 6 中对此进行了更改,并将 QList 和 QVector 统一为一个类。
QMetaType 和 QVariant 是 Qt 的元对象系统如何工作的基础。没有 QMetaType,就不可能有信号和插槽,并且动态调用需要 QVariant。这两个类在 Qt 6 中被几乎完全的重写。


Qt 的其他与图形无关的部分也发生了很大的变化。例如Qt Concurrent也经历了几乎完全的重写,并且现在比以往更加轻松地进行多线程应用程序的开发。

新的图形架构
Qt 5 的图形体系结构非常依赖 OpenGL 作为底层 3D 图形 API。但过去 8 年来随着 Metal 和 Vulkan 的推出,市场发生了巨大变化。现在 Qt 6 加入了大量不同平台的图形 API,以确保用户可以在所有平台上以最高性能运行 Qt。在 Qt Quick 中的所有 3D 图形现在都基于称为 RHI(渲染硬件接口)的 3D 图形新抽象层之上。RHI 使 Qt 可以使用基础 OS /平台的本机 3D 图形 API。因此在默认情况下,Qt Quick 现在将在 Windows 上使用Direct3D,在 macOS 上使用 Metal。Qt 中的 OpenGL 特定类仍然存在,但现在已从 QtOpenGL 模块中的 QtGui 中移出。此外,Qt 6 还添加了一个名为 QtShaderTools 的新模块,以跨平台的方式处理这些 API 的不同着色语言。

Qt Quick 3D 和 Qt 3D
Qt Quick 3D 是一个相对较新的模块,它通过 3D 功能无缝扩展了 Qt Quick。这个模块在 Qt 6 上有了重大的改进,它现在始终使用 RHI 抽象层来充分利用基础图形 API 和硬件。此外,它现在在 2D 和 3D 内容之间具有更深、更高性能的集成,使用户可以将 2D 项放置到 3D 场景中。它还大大改进了对 glTF2 和基于物理引擎的渲染支持。Qt 3D 现在也基于 RHI 抽象层之上,进行了一些性能改进和清理。

构建系统和软件包
Qt 6 还对构建和分发 Qt 的方式进行了一些重大更改。值得一提的是,Qt 6 本身现在是使用 CMake 构建的。这也为使用 CMake 构建项目的所有用户带来了体验优化。官方将在 Qt 6 的生命周期内继续支持 qmake,因此老用户暂时无需对构建系统进行任何更改,但是官方建议所有新项目都使用 CMake。它还带有一个更小的默认软件包,许多附加组件现在通过软件包管理器作为单独的软件包分发。它为用户提供了更大的灵活性,开发者可以选择仅下载其真正需要的内容。目前官方已经将现有的 Qt 安装程序用作软件包管理器的后端,但正在研究将来版本的替代方法。

支持平台
Qt 6 同样支持跨平台:
Windows 10
macOS 10.14 及更高版本
Linux (Ubuntu 20.04, CentOS 8.1, OpenSuSE 15.1)
iOS 13 或更高版本
Android (API level 23 及更高版本)
在嵌入式方面,Qt 6 支持各种运行 Linux 的嵌入式设备。不过对于 Qt 5 支持的嵌入式实时操作系统,Qt 6 尚未提供支持。QNX 和 INTEGRITY 近期已增加对 C++17 的支持,Qt 团队计划在发布 Qt 6.2 时增加对它们的支持。

兼容性
Qt 开发团队表示,在对 Qt 6 进行修改时,他们也基于未来使用场景的考虑对 API 进行了调整,同时在兼容性方面尽量减少对现有用户的破坏。因此,如果开发者希望使用 Qt 6,需要对代码进行调整。Qt 团队也表示已尽可能简化开发者移植到新版本的工作。在 Qt 6 中,开发团队为代码库进行了全面清理,以删除在 Qt 5 生命周期中被弃用的 API 及模块。Qt 5 中部分被删除的最常用 API 已被迁移到 Qt5CoreCompat 模块。它包含从 Qt 6 中删除的几个广泛使用的类,例如 QRegExp, QTextCodec 和用于 XML 的旧 SAX 解析器以及其他部分项目。此模块旨在帮助开发者进行迁移,除了针对 Qt 5 的回归测试和安全相关问题外,该模块不会收到 bug 修复。开发团队建议使用它进行移植,然后逐步删除对模块的依赖。对于下一个版本的发布安排,官方计划20121年4月发布 Qt 6.1,然后在9月底发布 Qt 6 系列的首个长期支持版本 Qt 6.2 LTS。当然官方也花了一些时间修复了很多被开发者诟病的问题,更多详情请查看其 Wiki 页面。

最新版本:6.2
Qt 6.2 LTS 已于2021年10月初发布,这是 Qt 6 的第一个长期支持版本。该版本专注于提高稳定性、性能,并且包含 Qt 5.15 中的所有常用功能以及为 Qt 6 添加的新功能。此外,同时发布的 Qt Design Studio 2.2 和即将发布的 Qt Creator 6 beta 都基于 Qt 6.2 LTS。

架构变化
Qt 6 中进行了一些更广泛的架构更改,包括:
Qt 6 现在依赖于 C++17 兼容的编译器,这有助于清理和改进代码库,并为用户提供更现代的 API
在处理大型数据集和性能方面改进了低级容器类
持续更新 QML 语言,使其更安全、更易于使用
引入 C++ 属性绑定
Qt 6 在如何处理与底层操作系统 API 的集成方面采用了全新的图形架构。得益于新的渲染硬件接口 (RHI),Qt 6 现在默认使用每个系统上可用的最佳图形 API,显着提高了兼容性 —— 尤其是在桌面和移动操作系统(如 Windows 和 macOS 以及 iOS)上。
简化了将 3D 内容集成到基于 QML 的应用程序的过程,并使混合 2D 和 3D 的同时从系统中获得最大性能。
将构建系统从 qmake 切换到 cmake,这是当今基于 C++ 的应用程序的标准构建系统。不过在 Qt 6 的整个生命周期内仍支持 qmake。

添加模块
除了极少数例外,Qt 5.15 支持的所有模块现在也适用于 Qt 6.2,包括:Bluetooth、Multimedia、NFC、Positioning、Quick Dialogs、RemoteObjects、Sensors、SerialBus、SerialPort、WebChannel、WebEngine、WebSockets、WebView
这些模块的 API 主要向后兼容 Qt 5,并且在移植到 Qt 6 时只需要对用户代码进行少量调整。

Qt 6.2 中的新功能

Qt Quick 3D
Qt Quick 3D 现在支持实例化渲染,允许使用不同的变换渲染大量相同的对象;添加了两个新 API,用于向场景添加 3D 粒子效果和从场景中的任意点进行基于光线的拾取
改进了输入处理,现在可以为嵌入在 3D 场景中的 2D 项目正确创建 Qt Quick 输入事件
QML 工具
Qt 6.2 现在有一个公共 CMake API,极大地简化了创建 QML 模块的过程
QML linter (qmlint) 现在可以完全配置,无论是在命令行级别,还是通过配置文件,甚至是 QML 文件本身中的各个块。此外,它现在可以生成 JSON 输出以简化与其他工具或自动化系统的集成
QML 格式化程序 (qmlformat) 现在使用 QML dom 库,改进了生成的输出
Qt 多媒体
 Qt 多媒体现在支持一些从未在 Qt 5 中正确支持的高要求的功能,包括播放的字幕和语言选择支持以及媒体捕获的可配置设置
内部架构不再像 Qt 5 那样通过公共 API 公开。这有助于能够更快地修复错误,并使将来添加新功能变得更加容易
Qt Creator 和 Qt Design Studio
Qt Creator 5 包含 Qt 6.2 开发所需的所有功能
Qt Design Studio 2.2 基于 Qt 6.2,极大地支持在一个图形工具中创建基于 Qt Quick 和 Qt Quick 的 3D 用户界面

新平台
Qt 6.2 大大扩展了支持平台的范围:


完全支持 Apple Silicon 上的 macOS。 Qt 现在可以轻松创建通用二进制文件并在 Intel 和 Apple Silicon 上为 macOS 进行开发,并提供了在 Apple 芯片上本地运行的完整支持
恢复了对 INTEGRITY 和 QNX 实时操作系统的支持。支持需要 C++17 工具链和最新版本的操作系统。 QNX 的最低要求是 7.1 版,而 INTEGRITY 是19.0.13 版。
针对 Qt 6.2 的 webOS 验证也已完成
有很多工作正在进行以支持 Windows 11,有望在 6.2 补丁级别版本中为其提供全面支持。Windows on ARM HW 也可作为 Qt 6.2 的技术预览提供
改进了对 WebAssembly 的支持,它在 Qt 6.2 中作为技术预览提供支持
扩展了对 Python 的支持

从 Qt 5 移植
在大多数情况下,从 Qt 5 移植到 Qt 6 很简单,一般步骤是:
检查是否使用了受支持的编译器和平台版本
在 Qt 6 模式下使用 Qt 5.15 编译(使用 QT_DISABLE_DEPRECATED_BEFORE 宏)
然后用 Qt 6.x 编译。如果需要,在移植阶段利用兼容性模块
开始使用 Qt 6 提供的所有新特性和功能。例如,如果应用程序使用 QML,请运行 qmlint 工具并修复它给出的警告

更多详细内容,请查看发行公告。

最新版本:6.5
Qt 6.5 LTS 已于2023年4月上旬正式发布,此版本为图形和 UI 开发者以及应用程序后端引入了许多新功能,还包含许多修复和通用的改进。6.5 将成为商业许可证持有者的长期支持 (LTS) 版本,部分更新亮点如下:

改进主题和样式:使用 Qt 6.5,应用程序能够便捷地支持 Windows 的深色模式。在 macOS 上,使用 QMessageBox 或 QErrorMessage 的应用程序将显示具有现代居中 UI 设计的原生对话框。

改进平台支持,包括 Web、移动设备和桌面
Qt 6.5 添加了对 Android 12 的支持,同时确保 Qt 在旧版本上继续按预期工作。即使平台发生重大变化,Qt 应用程序的单个构建现在也可以部署到任何运行 Android 8 至 12 版本的设备,而无需任何更改。此外,Qt 团队还为设备制造商升级了 Boot2Qt 软件堆栈,以使用 Yocto 4.1 (Langdale) 版本,它可以访问许多行业的嵌入式硬件的应用程序开发。在 Linux 桌面上,商业 Qt 6 Debian 11 包可以通过 apt 获得,因此可以方便地将商业 Qt 应用程序部署到基于 Debian 的 Linux 发行版。

Qt 6.5 for WebAssembly 是 6.4 中最初受支持版本的后续版本,现在添加了对视频渲染和小部件可访问性的支持。Qt WebEngine 已更新至 Chromium 108,甚至包括 Chromium 110 安全补丁。现在它支持在 Vulkan 下的 Linux 上为 X11 和 Wayland 进行硬件加速视频渲染。

其他变化:
引入新的 Qt Quick Effects 模块,改进 2D 和 3D 的美观性和性能
通过新的 Qt GRPC 模块添加了一个框架,用于在 Qt 中集成 gRPC 和 Protocol Buffer 技术。 Qt GRPC 允许与 gRPC 服务进行通信,并且与 Qt Protobuf 一起提供了用于序列化基于 Qt 的类的基础结构
Qt Location 模块处于技术预览版状态
改进 QML 模块与QOpenGLWidget 支持立体渲染
详情查看发行公告

最新版本:6.6
Qt 6.6 已正式于2023年10中旬发布,Qt 6 是 Qt 的最新版本,于 2022 年 12 月发布,带来了许多新特性和改进,如更强大的 QML 语言、更灵活的图形架构和更高效的内存管理等。在 Qt 6.5 的基础上,引入了一些新的模块和功能,同时修复了一些已知的问题和错误。其中最引人注目的新模块是 Qt Graphs(目前仍为技术预览阶段) ,它是 Qt Data Visualization 模块的替代品,用于创建各种类型的二维和三维图表,如折线图、柱状图、饼图、散点图等。Qt Graphs 使用 Qt Quick 3D 进行渲染,并支持原生的图形后端,如 OpenGL、Vulkan、Metal 和 Direct3D 。Qt Graphs 最终将提供大部分或全部 Qt Data Visualization 所提供的功能。


Qt Quick 也已支持响应式布局 (Responsive Layouts)。另一个值得关注的新功能是 Text To Speech 模块 ,它用于将文本转换为语音,并支持多种语言和发音,该模块在 Qt 6.6 Beta 中得到了改进,增加了对 Windows 平台上 Microsoft Speech API (SAPI) 5 的支持,从而提高了语音质量和可靠性。另外 Qt for Python 现已支持 asyncio,兼容 AArch64 架构,因此可以在 64 位嵌入式系统上使用。6.6版本其他关注的新功能:
更强大的 Wayland 合成器体验
支持 Qt GUI Module 以直接访问所用字体的 OpenType 功能
Qt 渲染硬件接口的 QRhi 系列类现在有了完整的文档
Qt Quick Shapes 模块添加了实验性曲线渲染后端
支持使用 Qt Quick 3D 导入 PLY 文件
对 Qt Quick 3D 的初步渲染扩展支持
Qt SQL 添加了 Mimer SQL 插件
改进 Qt TextToSpeech
详情查看发行公告


官方主页:http://qt-project.org/