对Qt Quick
Qt 6 是有意识地使框架更高效、更易用的结果。
我们尝试在每个版本中保持所有公共 API 的二进制和源代码兼容性。但为了使 Qt 成为一个更好的框架,有些改动是不可避免的。
在本主题中,我们总结了Qt Quick 中的这些变化,并提供了处理这些变化的指导。
对Qt Quick QML 类型的更改
更改了 font.weight 的类型
font.weight
的类型已更改为int
。预定义的权重类别仍然存在,但现在可以使用任意整数来选择与这些权重类别不匹配的字体。这确保了与 C++ API 的一致性,因为在 C++ API 中,字体权重一直可以用任意整数来表示。
除了使用字符串到枚举值的隐式转换外,大多数代码都不会受这一更改的影响。
font.weight: "Bold"
如下所示,这些代码将不再能正确解析,而必须替换为等价的枚举值。
font.weight: Font.Bold
FontLoader.name 现在是一个只读属性
在 Qt XML 5 中,FontLoader 的name
属性是可写的,设置后将覆盖项目的源属性。这造成了对其用途的一些混淆,如果冲突属性的设置器之间出现竞赛条件,则可能导致不确定行为。
这意味着以下代码将不再有效。
FontLoader { id: fontLoader name: "Helvetica" } Text { font.family: fontLoader.name text: "Foobar" }
取而代之的是使用自定义属性来存储字体族名称。
property string fontName: "Helvetica" Text { font.family: fontName text: "Foobar" }
删除 OpenGLInfo QML 类型
在 Qt 5.8 中,OpenGLInfo 已被弃用,并在 Qt 6 中被移除。请使用GraphicsInfo 代替。
着色器效果不再支持内联 GLSL 着色器字符串
与custom materials 一样,不再以 GLSL 着色器字符串的形式指定效果。相反,着色器有望通过QtShader Tools模块中的工具(如qsb
命令行工具)进行预处理,从而确保着色器资产在运行时无论使用哪种图形 API(Vulkan、Metal、OpenGL 或 Direct 3D)都能使用。ShaderEffect 项目有望引用生成的.qsb
文件。
着色器效果源属性现在是 URL
ShaderEffect 属性vertexShader 和fragmentShader 现在的类型都是QUrl ,而不是QByteArray 。因此,它们的行为与其他类似属性相同,如Image.source 。通过file
或qrc
方案引用文件的现有代码将继续按原样运行。此外,这一变更允许使用与组件(.qml 文件)位置相对的路径引用文件。因此,现在指定file:
方案是可选的。
对Qt Quick C++ 应用程序接口的更改
对 QQuickItem
QQuickItem的 geometryChanged() 函数更名为geometryChange() 。
对 QQuick* 应用程序接口的更改
- 希望集成自己的 Vulkan、Metal 或 Direct3D 渲染命令集的应用程序应注意除QQuickWindow::beforeRendering() 和 afterRendering() 之外的新QQuickWindow 信号。仅连接到 beforeRendering 或 afterRendering 的现有 Qt 5 模式通常已不能满足需要,可能需要连接到其他信号(如beforeRenderPassRecording() 或afterRenderPassRecording() )作为补充。
- 依赖QQuickWindow::beforeRendering() 或 afterRendering() 信号发布自己的 OpenGL 渲染命令集的应用程序,应在调用 OpenGL 之前调用QQuickWindow::beginExternalCommands() ,在调用之后调用QQuickWindow::endExternalCommands() 。这样可以确保应用代码所做的状态更改不会导致场景图渲染器自身缓存状态的混乱。但请注意,就像在 Qt XML 5 中一样,更改Qt Quick 渲染器未使用的 OpenGL 3.x 或 4.x 状态仍会导致意外问题,因此建议应用程序在从连接到这些信号的槽或 lambdas 返回之前,将任何此类 OpenGL 状态重置为默认值。
- 删除了现有的QQuickWindow::setRenderTarget() 重载和相关的获取器,取而代之的是一个接收QQuickRenderTarget 的新函数。现在,结合QQuickRenderControl 执行重定向渲染的应用程序应使用这个新函数,以一种与 OpenGL 无关的方式指定渲染目标。
- 接收QSGRendererInterface::GraphicsApi 参数的QQuickWindow::setSceneGraphBackend() 重载已更名为setGraphicsApi()。
- QQuickWindow 函数 setPersistentOpenGLContext 和 isPersistentOpenGLContext 已重命名,现在分别是QQuickWindow::setPersistentGraphics() 和QQuickWindow::isPersistentGraphics()。
- setClearBeforeRendering() 和 clearBeforeRendering() 已从QQuickWindow 中删除。Qt XML 6 中没有跳过颜色缓冲区清除的选项。在 Qt 5 中,调用 setClearBeforeRendering() 常常需要与底层结合使用,以防止Qt Quick 清除渲染到颜色缓冲区中的内容。在 Qt 6 中,有一种更稳健的方法:连接到
beforeRenderPassRecording()
信号,该信号会在清除后但在渲染Qt Quick'内容之前发出。 - QQuickWindow::openglContext() 函数已被删除。当应用程序确保场景图使用 OpenGL 进行渲染时,就可以从QSGRendererInterface::getResource() 中查询QOpenGLContext 。
- 已移除 QQuickWindow::openglContextCreated() 信号。
- 已移除过时的 QQuickWindow::createTextureFromId() 函数。取而代之,使用来自 QPlatformInterface::QSGOpenGLTexture、QPlatformInterface::QSGVulkanTexture、QPlatformInterface::QSGD3D11Texture 或 QPlatformInterface::QSGMetalTexture 的 fromNative() 函数。
- QQuickFramebufferObject 类的 API 不变,但只有在使用 OpenGL 渲染场景图时才起作用。在使用其他图形 API(如 Vulkan 或 Metal)时,该类将不起作用。依赖QQuickFramebufferObject 的应用程序应在其 main() 函数中调用
QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL)
,强制使用 OpenGL。 - QQuickRenderControl 在《OpenGL.NET》中,API 稍有改动:现在已移除 grab(),在适用情况下使用 () 代替。初始化()函数不再使用 。应用程序现在还需要酌情调用 () 和 ()。当需要进行多重采样时,必须调用新函数 () 来指示采样次数。QQuickWindow::grabWindow QOpenGLContext QQuickRenderControl::beginFrame QQuickRenderControl::endFrame QQuickRenderControl::setSamples
- 希望结合现有本地图形设备或上下文对象执行Qt Quick 渲染的应用程序必须使用新的QQuickWindow::setGraphicsDevice() 函数,因为QQuickRenderControl 不再提供
initialize(QOpenGLContext*)
函数。 - 将QQuickPaintedItem 和Context2D 设置为
Framebuffer
模式没有任何作用。其行为与将模式设置为默认图像模式相同。 - Qt 6.0 中仍支持环境变量
QSG_NO_DEPTH_BUFFER
,但建议通过在QQuickGraphicsConfiguration 上调用setDepthBufferFor2D() 来替代其用法,然后将其与QQuickWindow 关联。
QSG* 应用程序接口的更改
- QSGMaterialShader 的接口发生了变化。实现不应再依赖 OpenGL,也不能假定函数(如现已删除的 updateState())是以 current 调用的。在面向数据的新界面中,updateState() 被 (), () 和 () 所取代。现在,着色器不再以字符串形式提供 GLSL 着色器代码,而是由 Qt 模块中的工具(如 命令行工具)进行预处理,从而确保着色器资产在运行时无论使用哪种图形 API(Vulkan、Metal、OpenGL 或 Direct 3D)都能使用。QOpenGLContext updateUniformData updateSampledImage updateGraphicsPipelineState Shader Tools
qsb
- 已移除 QSGEngine。如果应用程序不太可能使用该类,建议移植到QQuickRenderControl 。
- QSGAbstractRenderer 不再是公共类。该类只有与 QSGEngine 结合使用才有意义,随着该类的删除,QSGAbstractRenderer 已转回私有。
- QSGSimpleMaterial 方便类已被删除。应用程序应使用修订后的独立于 OpenGL 的QSGMaterial API。
- 要访问QSGTexture 的底层本地纹理对象,不再使用 textureId()。相反,请使用 QSGTexture::platformInterface() 和 QPlatformInterface::QSGOpenGLTexture、QPlatformInterface::QSGVulkanTexture、QPlatformInterface::QSGD3D11Texture 或 QPlatformInterface::QSGMetalTexture。
- 现在,QSGImageNode 的子类必须覆盖新的附加虚函数,如 setAnisotropyLevel() 和 anisotropyLevel()。
- QSGTexture 的子类可能需要重新设计。一些特定于 OpenGL 的虚函数(如 bind() 或 updateBindOptions())已不复存在,而一些新的虚函数则必须实现,如comparisonKey()。
OpenGL 使用中的变化Qt Quick
虽然这不会对许多应用程序造成影响,但应用程序开发人员应注意,在 Qt 6 中,OpenGL 不再总是Qt Quick 渲染的默认选择。除非使用software
后端,否则Qt Quick 应用程序可以在运行时使用 OpenGL、Vulkan、Metal 或 Direct3D 11。如果没有通过QSG_RHI_BACKEND
环境变量或QQuickWindow::setSceneGraphBackend() 函数提出明确请求,则Qt Quick 会选择特定平台的默认值。
更多信息,请访问Qt Quick Scene Graph和Qt Quick Scene Graph Default Renderer页面。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.