本页内容

变更内容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 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 代替。

ShaderEffect 不再支持内联 GLSL 着色器字符串

与custom materials 一样,效果不再以 GLSL 着色器字符串的形式指定。 取而代之的是,着色器应由QtShader Tools模块中的工具(例如qsb 命令行工具)进行预处理,从而确保无论运行时使用哪种图形 API(Vulkan、Metal、OpenGL 或 Direct 3D),着色器资源均可正常使用。ShaderEffect 项应引用生成的.qsb 文件。

ShaderEffect 源属性现为 URL

ShaderEffect 的属性vertexShader 和fragmentShader 现均采用QUrl 类型,而非QByteArray 。因此,其行为与其他类似属性(如Image.source )完全一致。现有通过file 或qrc 方案引用文件的代码将保持原样继续运行。此外,此变更允许使用相对于组件(即.qml文件)位置的相对路径来引用文件。 因此,指定file: 方案现在是可选的。

Qt Quick C++ API 的变更

QQuickItem 的更改

QQuickItem的 geometryChanged() 函数已重命名为geometryChange()。

QQuick* API 的变更

QSG* API 的变更

  • QSGMaterialShader 接口已发生变更。实现不应再依赖 OpenGL,且不能假设诸如现已移除的 updateState() 等函数会以QOpenGLContext 对象作为参数被调用。在新的、以数据为导向的接口中,updateState() 已被updateUniformData()、updateSampledImage() 和updateGraphicsPipelineState() 所取代。 着色器不再以字符串形式提供 GLSL 着色器代码,而是需要由 QtShader Tools 模块中的工具(例如qsb 命令行工具)进行预处理,从而确保无论运行时使用哪种图形 API(Vulkan、Metal、OpenGL 或 Direct 3D),着色器资源均可正常使用。
  • 已移除 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 场景图和Qt Quick 场景图默认渲染器页面。

© 2026 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.