Qt Framework 6.11版本现已发布,在图形、连接性和语言能力方面带来了性能提升和新技术的支持,同时还引入了全新的异步C++编程方式。让我们来一探究竟。
发布概览
本次发布同样带来了大量改进、修复和新功能。我们来看一下更新亮点。
硬件加速2D渲染
新增模块Qt Canvas Painter,基于HTML Canvas 2D Context,可带来性能和开发效率的双重提升。更多详情请参阅《2D 渲染性能与效率提升:Qt Canvas Painter》。
3D功能改进
新的渲染技术:屏幕空间全局光照(SSGI)作为光照贴图烘焙的选项,以及屏幕空间反射(SSR)。同时,基于运动向量的时域抗锯齿算法也得到了改进。更多信息请参阅《全新实时渲染技术:SSGI与SSR》
QML中新增了可由用户定义的渲染通道,可直接实现后期处理效果、颜色拾取、图层蒙版等功能。更多详情请参阅高级渲染通道自定义。
交互式图表
您现在可以实现自定义图表,由用户定义的委托渲染每个数据点。新增了Qt示例——风力涡轮机仪表盘,并进行了多项改进,例如折线图的新样式方案以及3D图表的多坐标轴支持。详情请参阅《创建与交互图表的新方式》。
异步编程的声明式方法
Qt Task Tree为Qt中的异步编程和C++ API设计带来了全新方法。此外,各类API已实现统一,使任何异步任务都能适配该新模块。详情请参阅
其他改进
矢量图形、控件和无障碍功能的改进。详情请参阅UI框架和2D新增功能。
通过新模块Qt OpenAPI,连接网络服务现在更加便捷。详情请参阅《网络与连接性改进》。
在IDE中实现QML与C++之间的跳转,以及将C++后端数据提供给Qt Quick使用,都变得更加简单。详情请参阅《更简单的QML与C++集成》。
此外还有大量其他改进,涵盖多媒体、Android及API文档等领域。详情请参阅《还有哪些新功能?》。
提升性能和生产力:专为2D渲染而生的Qt Canvas Painter
本次发布带来了使用Qt进行2D图形绘制的新方式:Qt Canvas Painter。这是一个全新的模块,基于Qt的渲染硬件接口(RHI)构建,具备命令式2D图形渲染能力。硬件加速为您的UI图形带来了显著的性能提升,基准测试显示,相比之前的QPainter OpenGL后端模块,其速度有了大幅提升。
Qt Canvas Painter严格遵循大家熟悉的HTML Canvas 2D上下文规范,得以快速上手,从一开始就提供高效生产力。
除了性能和开发效率提升,新模块还带来了一些出色的高级特性。包括可调的抗锯齿、盒状渐变和阴影、网格图案、自定义着色器画笔和颜色效果——支持现代化、视觉丰富的UI和高效的GPU驱动绘图工作流。
最佳3D框架的改进
Qt已经演进到能提供与游戏引擎相同的3D功能,同时保持一致的高性能。这意味着即使使用复杂的元素、特效或动画,使用Qt Quick 3D的UI也能流畅运行。
新的实时渲染技术:SSGI、SSR和运动矢量
Qt 6.10版本改进了光照贴图烘焙技术(一种模拟光线与静态物体交互的技术),而6.11版本则引入了其动态替代方案。SSGI(屏幕空间全局光照)是一种渲染技术,可通过后处理效果模拟光线在屏幕表面上的反弹,并实时响应变化。不过,SSGI会带来一些性能代价,因此建议在资源有限的目标上使用光贴图烘焙,而在性能敏感度较低的应用上使用SSGI制作丰富的3D UI。

6.11中另一项新的实时渲染技术是屏幕空间反射(SSR)。类似于SSGI,它利用屏幕上可见的内容来渲染反射效果——其原理是对每个像素进行“光线步进”计算,并根据场景信息生成对应的反射效果。
更多信息:
参阅Jonas关于光照贴图烘焙、SSGI和SSR的博客
在Qt示例中亲自试用Qt Quick 3D - SSGI Lightmap
此外,通过场景环境(SceneEnvironment)和扩展场景环境(ExtendedSceneEnvironment)类型,Qt Quick 3D支持多种用于3D物体抗锯齿渲染的技术。时域抗锯齿和运动模糊在减少动态对象的锯齿感方面表现尤为突出。在Qt 6.11中,我们新增了基于对象的动态矢量生成功能,它在计算成本和输出保真度之间实现了极佳的平衡。
高级渲染通道自定义
对于需要高级视觉效果、优化性能或集成自定义技术而需要超越默认渲染管道的用户,Qt Quick 3D现在提供了自定义渲染通道的选项。新的图层和标签API可以指定哪些项目应包含在渲染管道的不同部分,将它们导向不同的渲染目标,并对单个渲染通道进行控制。你可以复用现有的材质,用附加着色器增强材质,或覆盖材质的某些方面。所有这些新增的灵活性都可通过QML直接使用。
查看Qt 6.11中Qt Quick 3D的更多示例:
Antti关于使用 Qt Quick 3D 粒子制作雨雪效果的博客
Sadegh关于如何使用真实 IES 配置文件实现体积光轴的博客
创建和交互图表的新方法
在图表方面,我们提供了一个新的Qt示例——风力涡轮机仪表盘,展示了从简单的2D演示到复杂的3D图表,来创建和组合数据可视化方案。这些图表在样式、标签或用户交互方面都具备高度的可定制性。

亲自试用:风力涡轮机仪表盘可在Qt示例中找到(请确保已安装Qt Graphs模块)
在这个新示例中,您可以看到3D图形现在支持多坐标轴展示。您可以为QBar3DSeries中的rowAxis、valueAxis 和columnAxis属性,或QScatter3DSeries和QSurface3DSeries中的axisX、axisY和axisZ属性使用不同的轴实例。我们为Graphs模块中的不同元素添加了多个新属性,以便对图形的渲染方式进行更多控制,从覆盖单个轴的主题颜色和区域图形中的渐变到折线图的线条、描边和连接样式。Bar3DSeries中的标签可以更灵活地自定义和定位,QDateTimeAxis可以使用时区并允许平移和缩放,QSplineSeries::optimized和GraphsItem3D.cutoffMargin等属性允许进一步微调。
如果这还无法满足您的需求 ,新的CustomSeries类型允许实现完全自定义的图形,可为每个数据点定义其专属的渲染方式。
异步编码的声明式方法:Qt TaskTree
Qt TaskTree是一个新模块,在Qt 6.11中作为技术预览版提供。
Qt TaskTree为Qt的API设计带来了全新的视角,为C++引入了一种声明式描述方法。异步工作流通过recipe(一个传递给TaskTree的可复用对象)以声明式描述的形式表达,然后由任务树自动管理整个流程。这清晰地将工作流与模板代码分离,使得代码比传统方法更具可读性。任务树会自动为您处理繁琐的任务,即使面对复杂的工作流,也能在一个地方清晰而精确地描述出来。

此外,Qt TaskTree还解决了API不兼容的问题,将各种异步API统一到一个通用接口中,并允许调整任何异步任务,使其与模块协同工作。
Qt TaskTree是一项重大变革,它从根本上改变了我们编写和读取异步代码的方式。
更多信息:
参阅Jarek的博客:Qt TaskTree模块介绍
访问Qt TaskTree文档
在线试用Task Tree Demo
其他显著改进
Qt 6.11发布的其他一些重大改进包括UI框架的新功能、更便捷的Web服务连接和其他连接性改进,以及更轻松地集成QML和C++。
UI框架和2D新增功能
在改进对Lottie和SVG矢量动画的支持方面,我们得到了很多很好的反馈。现在Qt 6.11中,我们继续推进这项工作。我们现在支持路径和形变动画,以及遮罩层、SVG遮罩和SVG符号。我们遵循CSS动画时序函数的预定义子集,并且用于Qt Quick VectorImage模块的Lottie后端以及lottietoqml工具现已结束技术预览阶段,正式进入稳定状态。
在UI框架方面,我们为Qt Quick Controls添加了备受期待的DoubleSpinBox,添加了控制 DialogButtonBox中默认按钮处理的API,并允许独立控制 RectangularShadow效果的角半径。
对于Qt Widgets用户,我们整合了多项贡献,新增以下功能:为QWizard添加新的StretchBanner选项、支持通过新的keyboardSearchFlags调整 QAbstractItemView默认键盘搜索行为的可能性,以及控制QColumnView中预览列可见性的能力。
在Qt Quick Controls和Qt Widgets中,我们改进了无障碍客户端在UI元素间导航的方式,以及获取角色和方向变更通知的方式。
Web和连接性改进
在Qt 6.11中,我们继续关注与Web服务的集成。有了Qt OpenAPI模块,可以轻松生成使用Qt Networks RESTful API的Qt HTTP客户端代码。该生成器是OpenAPI Generator的一个插件,因此它可以使用OpenAPI YAML规范,具有高度可定制性,并与CMake构建系统集成。
更多信息:
阅读Tatiana关于Qt 6支持OpenAPI的博客
访问Qt Open API文档
试用ChatGPT RESTful API客户端示例
对于Qt GRPC,我们新增了控制请求和响应流程及内容的机制。Qt HTTP Server模块通过多项改进,让实现可扩展服务器更容易,包括对限制参数的控制,以及在工作线程中处理响应的能力。在底层,QNetworkRequest现在可以为当前请求指定TCP Keep Alive参数,默认情况下,非活跃连接将在2分钟无活动后自动终止。
简化QML与C++的集成
QML语言服务器现在能识别QML类型的C++定义所在位置,从而可以在IDE中轻松地实现两种语言之间的跳转。C++代码可以通过ID查找QML对象,并且现在可以轻松遍历QML上下文的层次结构。在C++中声明的属性可以显式标记为virtual和overrides,以防止属性被意外遮蔽。
继Qt 6.10中引入QRangeModel后,QRangeModel又新增了一个配套类QRangeModelAdapter,它提供了一个遵循QAbstractItemModel协议的C++API,用于修改模型数据。对于每一行或每个项都由相同的QObject子类支持的数据,QRangeModel可以自动将每个对象的属性更改通知连接到dataChanged() 信号,从而无需额外代码即可让UI及时了解数据变化。这样,无需使用QAbstractItemModel API,Qt Quick(或Widget)项目视图就能更轻松地使用来自C++后端代码的数据。
更多信息:
阅读Sami关于QML语言服务器和linter新增功能的博客
阅读我关于QRangeModel更新和QRangeModelAdapter的博客
还有什么新内容?
以上重点介绍了Qt 6.11中的一些重要新增功能。在"Qt 6.11新特性"文档中,您还会发现许多其他特性,例如用于实时音频处理的新Qt Multimedia API。由于Qt Jenny、QtQuickView和退出QJniObject默认异常处理功能的改进,针对Android平台的开发人员将发现从C++调用Java/Kotlin API,反之亦然。
如果您使用qdoc为自己的API编写文档,您会发现一长串新命令,这些命令尤其适用于现代C++使用概念。改进后的现代C++API到HTML的渲染,使得阅读Qt中一些模板繁重的API更加容易。
致谢
感谢所有为Qt 6.11发布做出贡献的各位。您可以在发布说明的末尾找到为Qt源代码提供补丁的所有社区成员的完整列表。
特别感谢所有通过报告缺陷、分享使用场景以及提供反馈来帮助Qt变得更好的朋友们,尤其是在Beta测试期间针对技术预览模块和新功能提出的宝贵意见。最后,我要感谢所有参与发布工作的人员!