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 中,FontLoadername 属性是可写的,设置后将覆盖项目的源属性。这造成了对其用途的一些混淆,如果冲突属性的设置器之间出现竞赛条件,则可能导致不确定行为。

这意味着以下代码将不再有效。

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 属性vertexShaderfragmentShader 现在的类型都是QUrl ,而不是QByteArray 。因此,它们的行为与其他类似属性相同,如Image.source 。通过fileqrc 方案引用文件的现有代码将继续按原样运行。此外,这一变更允许使用与组件(.qml 文件)位置相对的路径引用文件。因此,现在指定file: 方案是可选的。

Qt Quick C++ 应用程序接口的更改

对 QQuickItem

QQuickItem的 geometryChanged() 函数更名为geometryChange() 。

对 QQuick* 应用程序接口的更改

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 GraphQt 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.