乘风破浪,遇见最美Windows 11之现代Windows桌面应用开发 - QT(v6.0)八年磨一剑,拥抱C++ 17和下一代QML

2019年8月7日,Qt 6的技术愿景--下一个大版本

https://www.qt.io/blog/2019/08/07/technical-vision-qt-6

image

7年前(2012),Qt 5发布了。从那时起,我们周围的世界发生了很多变化,现在是时候为新的主要版本定义一个愿景了。这篇博文抓住了能够和应该定义Qt 6的最重要的几点。

Qt 6将是我们在Qt 5系列中所做工作的延续,因此应该不会对我们的用户造成干扰。但是一个新的主要版本将给我们更高的自由度来实现新的特性和功能,并比我们目前在Qt 5系列中能更好地支持今天和明天的要求。正如下面详细描述的那样,Qt 6将致力于与Qt 5系列有很大程度的兼容性。我们也仍在开发Qt 5的新版本,我们的目标是将定义Qt 6的一些功能以略微缩小的形式带到Qt 5.14和Qt 5.15 LTS。随着Qt 5.14的功能冻结,更多的研发重点将转向Qt 6,我们的目标是在2020年底前将Qt 6.0准备好进行首次发布。在我们深入了解所有将是新的东西之前,让我们也记住Qt对用户的一些核心价值,来定义我们不想改变的东西。

是什么让Qt对我们的用户有价值?

Qt是一个横向的产品,被应用于许多不同的市场。Qt对我们的客户和用户的核心价值是:

  • 它的跨平台性,允许用户使用一种技术和单一的代码库将他们的应用程序部署到所有的桌面、移动和嵌入式平台。
  • 它的可扩展性,从低端、单一用途的设备到高端复杂的桌面应用或连接系统
  • 世界级的API和工具及文档,简化了应用程序和设备的创建过程
  • 可维护性、稳定性和兼容性,允许以最小的努力维护大型代码库
  • 一个拥有超过100万用户的大型开发者生态系统

新版本的Qt需要根据新的市场需求调整我们的产品,同时将上述5项作为我们工作的核心内容。

桌面市场是我们产品的根本,也是Qt的一个强大而重要的市场。它是我们大多数用户第一次接触Qt的地方,也是我们工具的基础。保持它的健康和增长是能够在其他市场增长的前提条件。

嵌入式和连接设备是我们增长最快的地方。触摸屏正以指数级的速度出现在越来越多的设备上,但这些设备的硬件价格点有很大压力。低端芯片组、微控制器,结合中小型触摸屏将被广泛使用。这些设备中的大多数将具有相对简单的功能,但需要抛光和流畅的用户界面。大量这样的设备将被创造出来,我们需要确保我们的产品能够瞄准这个空间,从而能够实现我们的可扩展性承诺。

同时,高端设备的用户界面将继续增加复杂性,包含数以千计的不同屏幕和许多应用程序。将二维和三维元素合并到一个用户界面将很普遍,增强和虚拟现实的使用也将很普遍。

人工智能元素将更普遍地用于应用程序和设备中,我们将需要有简便的方法来与这些元素整合

正在创建的连接设备数量的强劲增长,以及对用户体验的更高要求,使我们更需要关注世界级的工具,以简化应用程序和设备的创建。将用户体验设计师整合到开发工作流程中是我们的目标之一,但在其他许多领域,我们也需要努力简化用户的生活

Qt 6将是Qt的一个新的主要版本。这样一个新的主要版本的主要目标是为Qt在2020年及以后的需求做准备,清理我们的代码库,使其更容易维护。因此,重点将放在那些需要改变Qt架构的项目上,并且不能在不破坏Qt 5.x某种程度的兼容性的情况下完成。

下面是我们需要在Qt中做出的一些关键改变,以使其适应未来几年的发展。

新一代的QML(Next-generation QML)

QML和Qt Quick是过去几年中推动我们发展的主要技术。使用这些技术创建用户界面的直观方法是我们产品的一个独特卖点

但是,QML,因为它是为Qt 5创建的,有一些怪癖和限制。这反过来又意味着有可能出现重大的改进,我们正计划在Qt 6中实现这些改进。这里计划的主要变化是。

引入强类型。弱类型使我们的用户很难对他们的代码库进行大的修改。强类型系统允许IDE和其他工具支持我们的用户完成这项任务,并极大地缓解维护工作。而且,我们将能够生成性能更好的代码并减少开销。

让JavaScript成为QML的可选功能。在使用QML时,拥有一个完整的JavaScript引擎会使事情变得复杂,尤其是在针对低端硬件(如微控制器)时,是一种开销。然而,它在许多用例中是非常有用的。

移除QML的版本控制。通过简化QML中的某些查找规则和改变上下文属性的工作方式,我们可以消除对QML中的版本控制的需要。这反过来将导致QML引擎的大量简化,大大简化了我们维护Qt Quick的工作量,并简化了用户对QML和Qt Quick的使用

消除QObject和QML之间数据结构的重复

目前,相当多的数据结构在我们的元对象系统和QML之间是重复的,降低了启动性能,增加了内存使用。通过统一这些数据结构,我们将能够削减大部分的开销。

避免运行时生成的数据结构。这与之前的观点有关,许多重复的数据结构目前都是在运行时生成的。应该完全可以在编译时生成其中的大部分。

支持将QML编译成高效的C++和本地代码。通过强类型和更简单的查找规则,我们可以将QML转换为高效的C++和本地代码,大大增加运行时的性能

支持隐藏实现细节。"私有"方法和属性一直是一个长期的要求,能够隐藏QML组件中的数据和功能。

更好的工具集成。我们目前的QML的代码模型往往是不完整的,使得重构以及在编译时检测错误变得困难甚至不可能。有了上述变化,应该可以提供可以与C++竞争的编译时诊断,以及大大改进的重构支持。

新一代的图形(Next-generation graphics)

自从我们做了Qt 5.0之后,图形领域发生了很多变化,导致我们不得不对我们的图形堆栈做重大改变以保持竞争力。

在Qt 5中,我们使用OpenGL作为3D图形的统一API。从那时起,一系列新的API被定义。Vulkan是Linux上OpenGL的指定继承者,苹果正在推动Metal,而微软有Direct 3D。这意味着,Qt在未来必须与所有这些API无缝衔接。为了实现这一点,必须定义一个新的图形API抽象层(如用于平台集成的QPA),称为渲染硬件接口(RHI)。我们将需要把我们所有的渲染基础设施(QPainter、Qt Quick Scenegraph和我们的3D支持)建立在该层之上

这套不同的图形API也导致我们必须支持不同的着色语言(shading languages)。Qt Shader Tools模块将帮助我们在编译和运行时交叉编译着色器。

3D正扮演着越来越重要的角色,而我们目前的产品并没有一个统一的解决方案来创建包含2D和3D元素的UI。目前,将QML与Qt 3D或3D Studio的内容整合在一起是很麻烦的,而且会造成一些性能上的开销。此外,它不可能在2D和3D内容之间逐帧同步动画和过渡。

新的3D内容与Qt Quick的整合旨在解决这个问题。在这种情况下,一个完整的新渲染器将允许一起渲染2D和3D内容,并支持两者之间的任意嵌套。这将使QML成为我们的3D UIs的UI定义语言,并消除对UIP格式的需求。我们将在Qt 5.14中提供对3D支持的新Qt Quick的技术预览,更多信息将在另一篇博文中出现。

最后,新的图形堆栈需要得到一个体面的图形资产管道的支持,它允许在编译时为目标硬件和有关的使用情况准备这些资产。将PNG文件转换为压缩纹理,将其中许多文件编译为纹理图集,将着色器和网格转换为优化的二进制格式等等。

我们还旨在为Qt 6带来一个统一的主题/造型(theming/styling) 引擎,这将使我们能够在桌面和移动平台上为Qt Widgets和Qt Quick获得原生的外观和感觉。

统一和一致的工具(Unified and consistent tooling)

我们用于创建用户界面的图形工具被分成了两个,即Qt 3D StudioQt Design Studio。此外,Qt 3D Studio与Qt的其他部分略有脱节,导致了一些重复的工作。

我们将通过把Qt 3D Studio的必要功能合并到Design Studio中来统一这些功能。Design Studio与Qt Creator共享大量的代码和应用程序/插件框架,这使得我们有了很好的设计体验,并为我们提供了弥合设计者和开发者之间差距的工具。

设计工具也需要与内容创建工具(如Photoshop、Sketch、Illustrator、Maya、3D Max等)进行良好的整合

开发者工具需要大量的关注,以便我们能够为C++、QML和Python提供一流的支持。一个统一的工具还意味着开发者可以很容易地在Qt Creator中使用设计功能,用户体验设计师可以从开发者工具的功能中受益,如编译项目或设备上的测试。

QMake作为Qt 5中使用的构建系统有很多怪癖和限制。对于Qt 6,我们的目标是使用CMake作为一个标准的第三方构建系统来构建Qt本身。到目前为止,CMake是C++世界中最广泛使用的构建系统,我们非常需要与它更好的整合。我们将继续在QMake上支持我们的用户,但不会进一步开发它或用它来构建Qt框架本身。

加强我们的C++ APIs

在过去的几年里,C++发生了很大的变化。虽然我们不得不将Qt 5.0建立在C++98的基础上,但现在我们可以在Qt 6中依靠C++17。这意味着C++提供了更多我们在做Qt 5时没有的功能。我们在Qt 6中的目标是在不失去向后兼容性的前提下,更好地与这些功能相结合

对于Qt 6,我们的目标是使QML和Qt Quick引入的一些功能在C++中可用。我们努力为QObject和相关的类引入一个新的属性系统,将QML的绑定引擎整合到Qt的核心中,并使其在C++中可用。新的属性系统和绑定引擎将大大减少运行时的开销和绑定的内存消耗,并使其可用于Qt的所有部分,而不仅仅是Qt Quick

语言支持

在Qt 5.12中,我们引入了对Python的支持,我们还通过Qt for WebAssembly将浏览器作为一个新的平台。在6.0发布后,保持并进一步扩展这种跨平台的关注将是Qt 6系列的一个重要组成部分。

与Qt 5的兼容性和渐进式改进

与旧版本的兼容是非常重要的,也是我们开发Qt 6时的一个主要要求。有数十亿行的代码是用我们的框架编写的,因此我们所做的任何不兼容的改变都会给我们的用户带来代价。此外,改变Qt 6需要我们的用户做的工作越多,采用的速度就会越慢,这就导致我们这边需要花费更多的成本来维护Qt 5的最后版本。

因此,我们的目标应该是避免以引发用户代码库中的编译时或运行时错误的方式破坏Qt。如果我们必须破坏兼容性,编译时的错误比运行时的无声破坏要好得多(因为那些错误更难发现)

虽然我们确实需要删除Qt的某些废弃部分,但我们需要确保我们的用户拥有他们需要的功能。这意味着关键的功能,如Qt Widgets和其他大部分用户使用的部分,当然会保持可用。

我们正计划对我们的核心类和功能进行许多增量改进,这些改进是我们在Qt 5系列中无法做到的。我们的目标是保持完全的源代码兼容性,但由于我们可以打破与Qt 6的二进制兼容性,我们可以做相当多的清理和改进,这在Qt 5中是无法做到的

然而,我们需要继续前进,对Qt 6进行一些内部清理是必须的。我们将删除大部分在Qt 5中被废弃的功能(函数、类或模块)。这种内部清理将有助于长期释放我们的开发人员的时间,使我们能够更专注于维护和当前的代码库

然而,移植这些被废弃的部分需要尽可能的简单,我们的用户可以使用Qt 5.15 LTS逐步完成。我们的目标应该是让Qt 6与Qt 5.15 LTS有足够的兼容性,这样就可以很容易地维护一个庞大的代码库,可以同时针对两个版本进行编译。

市场和技术产品结构

除了改进Qt框架和工具外,我们的目标是为组件和开发工具创建一个新的市场(new marketplace for components and development tools)。这个市场将专注于我们的直接用户开发和设计应用程序和嵌入式设备,而不是针对消费者。因此,它将成为Qt生态系统的一个中心集结点。它将给第三方一个地方来发布他们对Qt的补充,允许免费和付费内容

在过去的几年里,Qt已经有了很大的发展,以至于提供一个新的版本是一项重要的工作。随着Qt 6的推出,我们有机会重组我们的产品,并有一个较小的核心产品,包含基本的框架和工具。我们将利用市场来提供我们的附加框架和工具,而不是将其与核心Qt产品紧密捆绑。这将为我们提供更多的灵活性,使我们能够在何时、以何种方式提供产品,并使我们能够为一些附加产品解耦发布时间表。

给我们提供反馈并参与进来

技术愿景将进一步发展,直到Qt 6的第一个版本。虽然我相信这份文件抓住了Qt下一版本的许多最重要的要点,但它肯定不是完整的。如果你有任何进一步的想法,请通过Qt的开放管理模式参与Qt 6的开发和相关讨论。

2020年12月08日,Qt 6.0发布

https://www.qt.io/blog/qt-6.0-released

image

我非常高兴地宣布今天发布的Qt 6.0。这是新的主要版本的首次发布,也是Qt的一个重要里程碑。我们在几年前就开始了最初的设想,从那时起,我们为创造下一代的Qt付出了巨大的努力。

image

多年来,Qt 5取得了巨大的成功,自我们发布Qt 5.0以来的八年时间里,我们的用户群和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(Leveraging C++17)
  • 下一代的QML(Next generation QML)
  • 新的图形架构(New graphics architecture)
  • Qt Quick的统一2D和3D(Unified 2D and 3D for Qt Quick)
  • CMake构建系统(CMake build system)(应用程序仍然支持qmake)。

当然,我们也花时间在其他领域做了大量的改进,太多了,这里就不一一列举了,我建议你看一下更详细的wiki页面。我们还将举办Meet Qt 6.0网络研讨会,覆盖"Americas/EMEIA"和EMEIA/APAC时区。但让我们来看看其中的一些亮点。

C++17

image

有了Qt 6,我们现在需要一个兼容C++17的编译器,以便在开发Qt时使用更现代的C++语言结构,同时也允许在API方面进行整合。

核心库和API(Core libraries and APIs)

在Qt Core上做了很多工作,因为它是实现Qt最核心部分的模块。我们已经在许多方面进行了改进。举出一些最重要的例子。

  • 新的属性和绑定系统。这个系统现在带来了绑定的概念,使QML在Qt 5中取得了巨大的成功,可以从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网络也进行了大量的清理和改进。详情请看这篇博文

2020年11月30日,Qt 6中的属性绑定

https://www.qt.io/blog/property-bindings-in-qt-6

Qt 6将带着许多新的功能到来。我们增加的最令人兴奋的功能之一是将QML和Qt Quick中的绑定概念带回Qt的核心,并允许从C++中使用它。

2020年9月30日,Qt 6中的QList变化

https://www.qt.io/blog/qlist-changes-in-qt-6

随着Qt 6的到来,许多组件都发生了变化。容器也不例外。在这篇博文中,我试图捕捉QList和相关类的最重要的变化。

2020年10月21日,QMetaType + QVariant中的新内容

https://www.qt.io/blog/whats-new-in-qmetatype-qvariant

正如你可能知道的,Qt有一个元类型系统,它提供关于类型的运行时动态信息。它可以将你的类型存储在QVariant中,在信号槽系统中排队连接,并在整个QML引擎中使用。随着Qt 6.0的即将发布,我们利用这个机会重新审视了它的基本原理,并利用了C++17赋予我们的功能。在下文中,我们将研究这些变化,并解释它们如何影响你的项目。

2020年10月5日,Qt 6中的Qt网络

https://www.qt.io/blog/qt-network-in-qt-6

在这篇博文中,我们想告诉你Qt网络模块在Qt 6中得到的一些最新更新和变化,以及一些潜在的未来发展。

参考

posted @ 2022-02-27 21:03  TaylorShi  阅读(573)  评论(0编辑  收藏  举报