发布时间:2020年12月08日(星期二)
我非常兴奋地宣布今天发布的Qt 6.0。这是一个新的主要版本的第一个版本,标志着Qt的一个重要里程碑。几年前,我们就开始了最初的构思,从那时起,我们投入了大量的精力来创建下一代的Qt。
Qt 5多年来取得了巨大的成功,自我们发布Qt 5.0以来的8年时间里,我们的用户群和Qt使用量都有了巨大的增长。但自2012年以来,世界已经发生了重大变化。Qt在嵌入式系统中的使用量猛增,C++的发展,以及新的3D图形API的出现。这些都是直接影响Qt的因素的例子。
作为一个跨平台框架,Qt需要适应这些变化的需求。在Qt 5的生命周期内,我们已经设法很好地适应了其中的许多需求。然而,在Qt 5系列中保持完全的源代码和二进制兼容性,使得某些事情无法在其生命周期内解决。有了Qt 6,我们现在有机会做出改变,构建出更适合未来几年的Qt。
因此,Qt 6的使命就是让Qt成为未来的生产力平台。Qt 6.0作为Qt的一个重要版本,给了我们更高的自由度来实现新的特性、功能,更好地支持今天和明天的需求。Qt 6.0是Qt 5系列的延续,我们专注于让用户的迁移不受干扰。大约18个月前,我发表了一篇Qt 6的愿景博文,捕捉到了这些想法。
在创建Qt 6的时候,我们确保Qt的核心价值得到了坚持和维护,包括。
- 它的跨平台性,允许用户使用一种技术和单一的代码库,将他们的应用程序部署到所有的桌面、移动和嵌入式平台。
- 其可扩展性从低端的单用途设备到高端复杂的桌面应用或连接系统。
- 其世界级的API和工具及文档,简化了应用程序和设备的创建。
- 它的可维护性、稳定性和兼容性,使用户能够以最小的努力维护庞大的代码库。
- 其庞大的开发者生态系统,拥有超过150万用户。
Qt 6.0是Qt 6系列的第一个版本,它在满足新的市场需求的同时,也保持了我们的核心价值。
在开发Qt 6时,我们对Qt的一些最核心的部分进行了深入的研究,以确定如何改进它们。我们发现了几个核心的重点领域,并投入了大量的时间进行改进。这些领域包括
- 利用C++17
- 下一代QML
- 新的图形架构
- 统一的2D和3D的Qt快速
- CMake构建系统(应用程序仍支持qmake)。
当然我们也花了时间在其他方面做了很多改进,太多了,在这里就不一一列举了,我建议你看看更详细的wiki页面。我们还将举办Meet Qt 6.0网络研讨会,覆盖美洲/EMEIA和EMEIA/APAC时区。但让我们来看看其中的一些亮点。
C++17
在Qt 6中,我们现在需要一个与C++17兼容的编译器,使我们在开发Qt时能够使用更多的现代C++语言结构,同时也允许在API方面进行整合。
核心库和API
Qt Core已经做了很多工作,因为它是实现Qt最核心部分的模块。我们已经在许多方面进行了改进。举几个最核心的例子。
- 新的属性和绑定系统:这个系统现在将QML在Qt 5中取得巨大成功的绑定概念从C++中引入。
- 字符串和Unicode。在Qt 5中,我们开始将Qt与Unicode完全结合起来,我们完成了很多工作,但仍有一些项目需要我们在Qt 6中进行清理。更多细节将在后面的单独博文中介绍。
- 在Qt 5中,QList一直是一个经常被人诟病的类,因为它是在堆分配存储在里面的大于指针的对象,导致堆分配方法的压力。在Qt 6中,我们改变了这一点,将QList和QVector统一为一个类。详情请参见我们的博客文章《Qt 6中的QList》。
- QMetaType和QVariant是我们Qt的元对象系统工作的基础。如果没有QMetaType,信号和插槽将无法实现,而QVariant则是动态调用所必需的。这两个类在Qt 6中得到了几乎完全的重写,你可以在这里阅读细节。
Qt的其他与图形无关的部分也有很大的变化。例如,Qt Concurrent 几乎进行了全面的重写,现在使多线程应用程序的开发比以往更加轻松。Qt Network也进行了大量的清理和改进。详情请看这篇博文。
新的图形架构
Qt 5 的图形架构在很大程度上依赖于 OpenGL 作为底层 3D 图形 API。虽然这在2012年我们创建Qt 5时是正确的做法,但随着Metal和Vulkan的引入,过去几年我们周围的市场发生了重大变化。我们现在有一大套不同的图形API,这些API在不同的平台上被普遍使用。对于Qt作为一个跨平台的框架来说,这当然意味着我们必须对此进行调整,并确保我们的用户可以在所有的平台上以最大的性能运行Qt。
因此,当Qt 5依靠OpenGL来实现硬件加速的图形时,Qt 6的情况完全改变了。Qt Quick中的所有3D图形现在都建立在一个新的3D图形抽象层之上,称为RHI(Rendering Hardware Interface)。RHI 使得 Qt 可以使用底层操作系统/平台的原生 3D 图形 API。因此,Qt Quick 现在将在 Windows 上使用 Direct3D,在 macOS 上默认使用 Metal。详情请看关于RHI的系列博文。
Qt中的OpenGL专用类仍然存在,但现在被移出QtGui,放在QtOpenGL模块中。我们还添加了一个名为QtShaderTools的新模块,以跨平台的方式处理这些API的不同着色语言。
Qt Quick 3D 和 Qt 3D
Qt Quick 3D是一个比较新的模块。它无缝扩展了Qt Quick的3D功能。对于Qt Quick 3D,我们的重点是创建一个API,它与Qt Quick的现有部分(用于2D用户界面)一样易于使用,同时为创建复杂的3D场景提供全面支持。这一努力背后的主要目标是实现2D和3D内容之间的无缝集成。
这个模块在Qt 6中得到了显著的改进,这是我们在Qt 5系列中无法做到的。最重要的是,它现在总是使用RHI抽象层来优化使用底层图形API和硬件。此外,它现在的特点是在2D和3D内容之间进行了更深入、更有性能的整合,允许你将2D项目放入3D场景中。它还大大改进了对glTF2和基于物理学的渲染的支持,使得导入在其他设计工具中创建的资产变得轻而易举。该模块还有许多其他重大改进,更深入的描述可以在单独的博客文章中找到。
Qt 3D现在也是基于RHI抽象层之上,已经进行了一些性能改进和清理。你可以在我们的合作伙伴KDAB的两篇博文中找到更多细节(这里和这里)。
Qt Quick的桌面样式设计
当我们为Qt Quick创建这套控件时,我们的重点是让它们变得轻量级和高性能,因此,它们在Qt 5中不支持桌面风格。然而,在Qt 6中,我们找到了一种方法,让它们在桌面操作系统上看起来和感觉上都是原生的。在 6.0 中,Qt Quick 现在支持 macOS 和 Windows 上的原生样式。详情请看这篇博文。在Qt 5中,Android和Linux的原生外观和感觉已经通过Material和Fusion风格而存在,我们正在为未来的Qt版本改进这些风格,同时也计划为iOS实现原生风格。
与平台特定功能的接口
即使Qt提供了开发应用程序所需的大部分功能,但有时还是需要与平台特定的功能进行接口。在Qt 5中,我们提供了一组附加模块(QtX11Extras, QtWinExtras, QtMacExtras)来帮助实现这一目的。但这种与Qt其他部分完全分离的做法导致了一些架构上的问题,不一致和Qt内部的代码重复。在 Qt 6 中,我们努力清理这些问题,并将这些附加模块提供的功能折叠到 Qt 中直接提供的特定平台 API 中。这将使Qt 6中与操作系统/平台特定API的接口变得更加容易。请看这里了解更多细节。
构建系统和打包
我们在构建和发布 Qt 的方式上也做了一些相当大的改变。 值得一提的是,Qt 6本身现在已经使用CMake构建。这也为我们所有使用 CMake 构建项目的用户带来了显著的改进。我们将在Qt 6的生命周期内继续支持qmake,所以如果你正在使用qmake的话,不需要对你的构建系统做任何改变,但我们建议在所有新项目中使用CMake。
Qt 6还附带了一个小得多的默认包,许多附加组件现在都通过包管理器作为单独的包分发。这让我们可以更灵活地根据市场的需求调整附加组件的发布时间表,例如,可以像核心Qt包一样更频繁地发布功能,或者让它们同时适用于多个Qt版本。此外,我们还可以使用包管理器作为第三方内容的交付渠道。最后,它为我们的用户提供了更多的灵活性,因为他们可以选择只下载他们真正需要的内容。
目前,我们使用现有的Qt安装程序作为包管理器的后端,但正在研究未来版本的替代方案。更多细节请看这里的博客文章。
兼容性
在对 Qt 6 进行修改时,我们试图调整我们的 API,使其符合我们认为未来所需的要求,同时尽量减少对现有用户的破坏。虽然您的代码需要进行一些调整,以尽可能地使用 Qt 6,但我们已经尽量使移植到新版本变得简单。
我们做的第一件事就是清理我们的代码库。在Qt 5的生命周期中,我们废止了不少API甚至整个模块。我们所做的第一件事就是删除这些,以便为未来的Qt提供更精简的服务,并允许我们留下一些今天已经没有意义的东西。
然而,我们已经注意将尽可能多的这些API标记为Qt 5.15中的废弃。启用废弃警告并清理这些API将使你的代码库与Qt 6兼容。
一些在 Qt 5 中被删除的最常用的 API 已经被移到了 Qt5CoreCompat 模块中。它包含了一些在Qt 6中被广泛使用的类,如QRegExp,QTextCodec,旧的XML的SAX解析器,以及其他一些项目。这个模块的目的是作为一个移植帮助,除了针对Qt 5的回归和安全相关问题外,不会收到bug修复。我们建议您使用它来进行移植,但随后逐步删除您对模块的依赖。
如果你想开始移植到 Qt 6,我们的文档中有更详细的移植指南。
支持的平台
Qt一直以来都是跨平台的,这一点在Qt 6中也会延续。Qt 6.0支持
- Windows 10
- macOS 10.14及更新版本
- Linux (Ubuntu 20.04, CentOS 8.1, OpenSuSE 15.1)
- iOS 13或更新版本
- 安卓(API级别23或更新
在嵌入式方面,我们支持各种运行Linux的嵌入式设备。Qt 6还不支持Qt 5支持的任何嵌入式实时操作系统,QNX和INTEGRITY最近都增加了对C++17的支持,我们计划在发布Qt 6.2时增加对它们的支持。
展望
Qt 6.0还不支持许多可以在Qt 5.15中找到的附加模块。这是有意决定的,以腾出时间来确保我们可以完成所有我们需要为Qt框架的基本模块所做的改动。
我们现在正在努力将这些附加组件中的大部分带到Qt 6中。我们已经做了大量的工作,我们希望在发布Qt 6.2的时候能够重新支持大部分附加组件。许多附加组件已经针对 Qt 6 进行了编译,但它们还没有正式发布,因为还有一些清理工作和重构工作要做。我们计划在发布 Qt 6.2 时将大部分重要的附加组件移植过来。在下面的博文中,您可以了解到我们对Qt 6.0及以后的附加组件支持的完整概述。
除了将缺失的附加组件移植到 Qt 6 中,在接下来的几个月里,我们与 Qt 6 相关的很多工作将集中在新版本的稳定性上,并将新的属性系统在 Qt 中得到更广泛的使用。
我们已经调整了Qt 6.1和6.2的发布时间表,并计划在4月份发布Qt 6.1。之后,我们计划在9月底发布Qt 6系列的第一个长期支持版本Qt 6.2 LTS。
而我们今年的工作还没有结束,你还可以期待在圣诞节前发布全新版本的Qt Creator和Qt Design Studio! 这两款产品都将全面支持Qt 6。
总结
Qt 6.0是下一代Qt的起点。它还没有像5.15那样功能完整,但我们将在未来几个月内填补这些空白。我们已经做了很多重要的工作,为下一个版本的Qt奠定了基础。其中许多变化可能不会立即显现,但我坚信它们将有助于在未来几年内保持 Qt 的竞争力。
我要感谢所有帮助Qt 6.0成为可能的人。在Qt 6的开发过程中,有超过250人贡献了代码,还有数千人帮助完成了错误报告并提供了反馈。没有你们,Qt 6就不会有今天的成就。非常感谢你们的辛勤工作。
最后,希望大家都能喜欢Qt 6所带来的一切。如果你喜欢的模块还没有移植过来,不要担心,我们正在努力解决这些问题。请到我们的网站或你的Qt账户下载新版本。让我们知道你的想法,我们非常感谢所有的反馈,以帮助我们使后续的版本变得更好。
通过www.DeepL.com/Translator(免费版)翻译