Qt 6.0正式发布了

本文翻译自:Qt 6.0 Released
原文作者:Lars Knoll,Qt开源项目首席维护官
校审:Sam Wang


我很高兴地宣布Qt 6.0今天正式发布。这是Qt 6这一全新系列的首个版本,是Qt的一个重要里程碑。几年前,我们开始研究最初的想法,并从那时起投入了大量精力开发新一代Qt。

Qt 5取得了巨大成功,发布八年来,我们的用户群增长巨大。但自2012年以来,我们周围的世界也变化迅速。Qt在嵌入式系统中的应用猛增,同时C ++也在不断发展,还诞生了新的3D图形API。这些是直接影响Qt的主要因素。

作为一个跨平台框架,Qt需要适应这些不断变化的需求。在Qt 5的生命周期中,我们已经很好地适应了这些需求。然而,在Qt5系列中要保持完整的源代码和二进制兼容性使得某些事情在它的生命周期内不可能修复。现在,Qt6让我们有机会做出改变,并构建Qt以更好地适应未来几年的需求。

因此,Qt 6的使命是让Qt成为面向未来的生产力平台。Qt 6.0作为Qt的主要版本,Qt 6.0给了我们更高的自由度来实现新特性、功能,以更好地支持当下和未来的需求。Qt 6.0是Qt 5系列的延续,我们一直致力于让迁移对用户无中断。大约18个月前,我发表了一篇名为《Qt 6的技术概览》的博文,记录了这些想法。

开发Qt 6时,我们确保遵守并维护Qt的核心价值,包括:

  • 跨平台特性,用户可使用一种技术,把一套代码构建的应用程序部署到所有的桌面、移动和嵌入式平台
  • 可扩展性,覆盖了从低端的单用途设备到高端复杂的桌面应用程序和互联系统
  • 世界一流的API、工具和文档,简化了桌面和嵌入式应用程序的开发
  • 可维护性、稳定性和兼容性,轻松维护大型代码库
  • 拥有超过100万用户的庞大生态系统

Qt 6.0是Qt 6系列的第一个版本,它旨在满足新的市场需求,同时将核心价值作为我们工作的核心。

在Qt 6开发过程中,我们深入研究了Qt 的核心部分,以确定改进方式。 我们发现了几个核心重点,并投入了大量时间进行改进,包括:

  • 利用C ++ 17特性
  • 下一代QML
  • 全新图形架构
  • 使用Qt Quick统一2D和3D图形
  • CMake构建系统(应用程序仍支持qmake)

当然,我们也花时间在其他领域做了大量的改进,这里有很多描述信息,建议您阅读更详细的Wiki页面。 我们还将举办Meet Qt 6.0的网络研讨会,分别涵盖美洲/欧洲时区和欧洲/亚太时区。但是让我们一起先来看看一些亮点。


C++ 17

在Qt 6中,我们需要一个兼容C ++ 17的编译器。 这使得在开发Qt时可以使用更现代的C ++语言结构,并允许我们提供与标准C++更好的集成。


核心库和API

我们为Qt Core做了大量工作,因为它是实现Qt最核心部分的模块,我们做了许多改进。 列举几个最重要的例子:

  • 新的属性和绑定系统:该系统将绑定的概念(使QML在Qt5取得了巨大成功)带回到了Qt的核心,并使其可用于C ++。
  • 字符串和Unicode:Qt 5时我们朝着使Qt与Unicode完全对齐的方向发展,所以许多工作已经完成。 但是,剩下的一些部分已在Qt 6中得到了清理。更多详细信息将很快在另一篇博文中介绍。
  • QList在Qt 5中经常受到批评,因为它是对存储在其中的大于指针的对象进行堆分配,这给内存分配器带来了很大的压力。 在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,运用在各种平台上。对于作为跨平台框架的Qt而言,这无疑意味着我们必须适应这一点,并确保用户可以在所有平台上都以最高的图形性能运行Qt。


因此,虽然Qt 5仍依赖OpenGL实现硬件加速图形,但Qt 6完全改变了局面。Qt Quick中的所有3D图形现在都建立在新的3D图形抽象层之上,该抽象层称为渲染硬件接口(RHI)。这使Qt可以使用目标OS /平台上原生的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中,我们的重点是创建一个与Qt Quick现有部分(用于2D用户界面)一样方便使用的API,同时也为创建复杂的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中,我们找到了一种方法,使它们在桌面操作系统上看起来更像原生控件。Qt 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,因此,如果您正使用它,则无需更改构建系统,但是我们建议所有新项目都使用CMake

Qt 6还附带了一个更小的默认程序包,许多附加组件现在通过程序包管理器作为单独的包分发。这使我们能更灵活地根据市场需求调整附加组件的发布时间表,例如,允许核心Qt包更频繁地发布新特性,或者让它们同时适用于多个Qt版本。此外,我们可以使用程序包管理器作为第三方内容的交付渠道。最后,用户可以灵活地选择只下载真正需要的内容。

目前,我们正使用现有Qt安装程序作为程序包管理器的后端,但正在研究未来版本的替代方案。更多细节请参阅这篇博文

 

兼容性

当修改Qt 6时,我们尝试调整APIs以适应我们认为的未来需求,同时尽量减少对现有用户的妨碍。尽管您的代码需要做些调整以充分利用Qt 6,但我们已经尝试尽可能轻松地移植到新版本。

我们做的第一件事就是清理代码库。在Qt 5生命周期中,我们废弃了相当多的APIs,甚至整个模块。我们做的第一件事是删除这些内容,以打造更精简的Qt,并允许我们抛下一些今天看来不再有意义的内容。

其实我们已小心翼翼地标记了那些在Qt 5.15中弃用的APIs。启用废弃警告并清除这些APIs将使您的代码库兼容Qt 6迈进一大步。

Qt 5中删除的某些最常用的APIs已被移动到Qt5CoreCompat模块中。它包含几个从Qt 6中删除的广泛使用的类,如QRegExp、QTextCodec、旧的用于XML的SAX解析器以及一些其他项目。本模块的目的是作为移植助手,除了针对Qt 5的回归和与安全相关的问题之外,不接受bug修复。我们建议您将它用于移植,但随后逐步移除对该模块的依赖。

如果您想开始移植到Qt6,可以在我们的文档中找到更详细的移植指南

 

支持的平台

Qt的核心价值之一是跨平台,并将在Qt 6延续。Qt 6.0支持:

  • Windows 10
  • macOS 10.14 及更新版本
  • Linux (Ubuntu 20.04, CentOS 8.1和OpenSuSE 15.1)
  • iOS 13或更新版本
  • Android (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和Qt 6.2的发布时间表,计划在4月份发布Qt 6.1。之后,我们计划在9月底发布Qt 6系列的第一个长期支持版本,Qt 6.2 LTS。

我们今年的发布工作还没结束,您还可以期待一个全新版本的Qt Creator和Qt Design Studio在圣诞节前发布!两者都将全面支持Qt 6。

 

摘要

Qt 6.0是下一代Qt的起点。它还没有Qt 5.15那么完整,但我们将在未来几个月填补这些空白。在为Qt下一个版本奠定基础方面,我们已经做了大量重要的工作。其中许多变化可能不会立即显现,但我坚信它们将有助于Qt在未来几年保持竞争力。

感谢所有助力Qt 6.0实现的人。在整个开发过程中,超过250位开发者贡献了代码,成千上万的开发者帮助编写了bug报告并提供了反馈。没有大家,就不会有今天的Qt 6。非常感谢大家的辛勤工作!

最后,希望大家都喜欢Qt 6。如果您最喜欢的模块尚未移植,别担心,我们正在努力。请从我们的网站或通过您的Qt帐户下载新版本。分享您的想法。我们欢迎所有反馈意见,以帮助我们使后续版本更好!

 

已标记关键词 清除标记
相关推荐