Qt 6.0

2020-12-09 19:32:24

我很高兴宣布今天发布Qt 6.0。这是新主要版本的第一个版本,标志着Qt的重要里程碑。几年前,我们开始研究最初的想法,从那时起,我们投入了巨大的精力来创建下一代Qt。

多年来,Qt 5取得了巨大的成功,并且自发布Qt 5.0以来的八年中,我们看到了用户群和Qt使用量的巨大增长。但是自2012年以来,世界发生了重大变化。嵌入式系统中Qt的使用量猛增,C ++不断发展,新的3D图形API出现了。这些是直接影响Qt的因素示例。

作为跨平台框架,Qt需要适应那些不断变化的需求。在Qt 5的生命周期内,我们已经设法很好地适应了其中的许多要求。但是,在Qt 5系列中保持完整的源代码和二进制兼容性使得某些事情在其生命周期内无法修复。使用Qt 6,我们现在有机会进行更改并构建Qt,使其更适合未来几年。

因此,Qt 6的任务是使Qt成为未来的生产力平台。作为Qt的主要版本,Qt 6.0为我们提供了更高的自由度,以实现新功能,新功能以及更好地支持当今和未来的需求。 Qt 6.0是Qt 5系列的延续,我们一直致力于使迁移对用户无干扰。我发表了一个Qt 6视觉博客文章,记录了大约18个月前的想法。

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

它具有跨平台的特性,允许用户使用一种技术并从单个代码库将其应用程序部署到所有台式机,移动和嵌入式平台

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

在开发Qt 6时,我们深入研究了Qt最重要的部分,以确定如何改进它们。我们发现了两个核心重点领域,我们投入了大量时间进行改进。这些领域包括:

当然,我们也花了一些时间在其他方面进行了许多改进,在此没有太多提及,我建议您看一下更详细的Wiki页面。我们还将举办涵盖美国/ EMEIA和EMEIA / APAC时区的Meet Qt 6.0网络研讨会。但是,让我们来看看其中的一些亮点。

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

Qt Core已完成许多工作,因为它是实现Qt最核心部分的模块。我们已经遍历了许多领域并进行了改进。列举一些最核心的:

新的属性和绑定系统:该系统现在引入了绑定的概念,使QML在C ++的Qt 5中取得了巨大的成功。

字符串和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图形现在都基于称为RHI(渲染硬件接口)的3D图形新抽象层之上。 RHI使Qt可以使用基础OS /平台的本机3D图形API。因此,默认情况下,Qt Quick现在将在Windows上使用Direct3D,在macOS上使用Metal。有关详细信息,请参阅有关RHI的博客文章系列。

Qt中的OpenGL特定类仍然存在,但现在已从QtOpenGL模块中的QtGui中移出。我们还添加了一个名为QtShaderTools的新模块,以跨平台的方式处理这些API的不同着色语言。

Qt Quick 3D是一个相对较新的模块。它通过3D功能无缝扩展了Qt Quick。借助Qt Quick 3D,我们的重点是创建一个与Qt Quick的现有部分一样易于使用的API(用于2D用户界面),同时提供对创建复杂3D场景的全面支持。这项工作的主要目标是实现2D和3D内容之间的无缝集成。

该模块在Qt 6上取得了重大改进,这在Qt 5系列中是无法做到的。最重要的是,它现在始终使用RHI抽象层来充分利用基础图形API和硬件。此外,它现在还具有2D和3D内容之间更深入,更高性能的集成,使您可以将2D项放置到3D场景中。它还大大改进了对glTF2和基于物理的渲染的支持,因此导入其他设计工具中创建的资产变得微不足道。该模块还有许多其他重大改进,可以在单独的博客文章中找到更深入的描述。

Qt 3D现在也基于RHI抽象层,已经看到了一些性能改进和清理。您可以在我们的合作伙伴KDAB的两篇博客文章中找到更多详细信息(此处和此处)。

当我们为Qt Quick创建控件集时,我们的重点是使它们轻巧高效。因此,他们在Qt 5中不支持桌面样式。但是,在Qt 6中,我们找到了一种使它们看起来更美观的方法。在桌面操作系统上感觉很自然。通过6.0,Qt Quick现在在macOS和Windows上都支持本机样式。有关详细信息,请参见此博客文章。本机外观Qt 5中的Material和Fusion样式已经具有Android和Linux的感觉。我们正在为将来的Qt发行版本进行改进,并且还计划为iOS实现本机样式。

即使Qt提供了独立开发应用程序平台所需的大多数功能,有时仍需要与特定于平台的功能进行交互。在Qt 5中,我们提供了一组附加模块(QtX11Extras,QtWinExtras,QtMacExtras)来帮助实现此目的。但是,与Qt其余部分的这种完全隔离导致了Qt内部的一些体系结构问题,不一致和代码重复。在Qt 6中,我们努力进行清理,并将那些附加模块提供的功能折叠到直接在Qt中提供的特定于平台的API中。在Qt 6中,这将使与OS /特定于平台的API的接口更加容易。请查看此处以了解更多详细信息。

我们还对构建和分发Qt的方式进行了一些重大更改。值得一提的是,Qt 6本身现在是使用CMake构建的。这也为使用CMake构建项目的所有用户带来了重大改进。我们将在Qt 6的生命周期内继续支持qmake,因此,如果您正在使用构建系统,则无需对其进行任何更改,但是我们建议对所有新项目都使用CMake。

Qt 6还带有一个更小的默认软件包,许多附加组件现在通过软件包管理器作为单独的软件包分发。这使我们能够更灵活地调整加载项的发布时间表以适应市场需求,例如,允许将更频繁的功能发布作为核心Qt软件包,或使其同时可用于多个Qt版本。此外,我们可以将包裹管理器用作第三方内容的传递渠道。最后,它为我们的用户提供了更大的灵活性,因为他们可以选择仅下载他们真正需要的内容。

当前,我们将现有的Qt安装程序用作软件包管理器的后端,但正在研究将来版本的替代方法。有关更多详细信息,请参见此处的博客文章。

在对Qt 6进行更改时,我们尝试将API调整为我们认为对未来的要求,同时尝试尽量减少现有用户的使用量。尽管您的代码将需要进行一些调整以最大程度地利用Qt 6,但我们已尝试使向新版本的移植尽可能容易。

我们要做的第一件事就是清理代码库。在Qt 5的生命周期内,我们弃用了许多API,甚至整个模块。我们要做的第一件事就是删除那些,以便将来获得更精简的Qt,并让我们留下一些今天不再有意义的东西。

但是,我们已经小心地标记了尽可能多的Qt 5.15中不推荐使用的API。在那儿启用弃用警告并清除它们,将使您的代码库与Qt 6兼容很长。

在Qt 5中已删除的一些最常用的API已移至Qt5CoreCompat模块中。它包含从Qt 6中删除的几个广泛使用的类,例如QRegExp,QTextCodec,用于XML的旧SAX解析器以及其他一些项目。除了针对Qt 5的回归和与安全相关的问题之外,该模块的意图是作为移植帮助,并且不会收到错误修复。我们建议您使用它进行移植,然后逐步删除对模块的依赖。

如果您想开始移植到Qt 6,我们的文档中有更详细的移植指南。

Qt一直是跨平台的,并且将在Qt 6中继续。Qt 6.0支持

在嵌入式方面,我们支持各种运行Linux的嵌入式设备。 Qt 6尚不支持Qt 5支持的任何嵌入式实时操作系统。QNX和INTEGRITY最近都增加了对C ++ 17的支持,我们计划在发布Qt 6.2时增加对它们的支持。

Qt 6.0尚不支持Qt 5.15中提供的许多附加模块。这是有意决定的,以腾出时间来确保我们可以完成对Qt框架的基本模块进行的所有更改。

我们现在正在努力将大多数这些附加组件引入Qt6。我们已经做了大量的工作,并且我们希望在发布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帐户下载新版本。让我们知道您的想法,我们感谢您提供所有反馈意见,以帮助我们更好地发布后续版本!