En esta página

Los cambios introducidos en Qt Quick

Qt 6 son el resultado del esfuerzo consciente por hacer el framework más eficiente y fácil de usar.

Intentamos mantener la compatibilidad binaria y de código fuente de todas las API públicas en cada versión. Pero algunos cambios eran inevitables en un esfuerzo por hacer de Qt un framework mejor.

En este tema resumimos esos cambios en Qt Quick, y proporcionamos una guía para manejarlos.

Cambios en Qt Quick Tipos QML

Cambiado el tipo de font.weight

El tipo de font.weight se ha cambiado a int. Las clases de peso predefinidas siguen existiendo, pero ahora es posible usar enteros arbitrarios para seleccionar fuentes que no coincidan con ninguna de estas clases de peso. Esto asegura la paridad con la API de C++, donde siempre ha sido posible expresar el peso de la fuente como un entero arbitrario.

La mayor parte del código no se verá afectado por este cambio, excepto en el caso de que se haya utilizado una conversión implícita de una cadena a un valor enum.

font.weight: "Bold"

Este código ya no se parseará correctamente y tendrá que ser reemplazado por su valor enum equivalente, como se demuestra a continuación.

font.weight: Font.Bold

FontLoader.name es ahora una propiedad de sólo lectura

En Qt 5, la propiedad name de FontLoader era escribible y anulaba la propiedad fuente del elemento cuando se establecía. Esto causaba cierta confusión en cuanto a su propósito y podía causar un comportamiento indeterminado si había una condición de carrera entre los setters de las propiedades en conflicto.

Esto significa que código como el siguiente ya no funcionará.

FontLoader {
    id: fontLoader
    name: "Helvetica"
}

Text {
    font.family: fontLoader.name
    text: "Foobar"
}

En su lugar, utilice una propiedad personalizada para almacenar los nombres de las familias de fuentes.

property string fontName: "Helvetica"

Text {
    font.family: fontName
    text: "Foobar"
}

Se elimina el tipo QML OpenGLInfo

En Qt 5.8, OpenGLInfo quedó obsoleto y se ha eliminado para Qt 6. Por favor, utilice GraphicsInfo en su lugar.

ShaderEffect ya no soporta cadenas de sombreado GLSL en línea

Al igual que con custom materials, los efectos ya no se especifican en forma de cadenas de sombreado GLSL. En su lugar, se espera que los sombreadores sean preprocesados por las herramientas del módulo Qt Shader Tools, como la herramienta de línea de comandos qsb, garantizando así que los activos de sombreado sean utilizables independientemente de la API gráfica (Vulkan, Metal, OpenGL o Direct 3D) que se utilice en tiempo de ejecución. Se espera que los elementos ShaderEffect hagan referencia a los archivos .qsb resultantes.

Las propiedades ShaderEffect Source ahora son URLs

Las propiedades ShaderEffect vertexShader y fragmentShader tienen ahora un tipo QUrl, en lugar de QByteArray. Su comportamiento es, por tanto, idéntico al de otras propiedades similares, como Image.source. El código existente que hace referencia a archivos mediante el esquema file o qrc seguirá funcionando como hasta ahora. Además, este cambio permite hacer referencia a archivos con una ruta relativa a la ubicación del componente (el archivo .qml). Por lo tanto, ahora es opcional especificar el esquema file:.

Cambios en las API C++ de Qt Quick

Cambios en QQuickItem

QQuickItemLa función geometryChanged() de QQuickItem ha sido renombrada a geometryChange().

Cambios en las API de QQuick

  • Las aplicaciones que deseen integrar su propio conjunto de comandos de renderizado Vulkan, Metal o Direct3D deben ser conscientes de las nuevas señales QQuickWindow además de QQuickWindow::beforeRendering() y afterRendering(). El patrón existente en Qt 5 de conectarse sólo a beforeRendering o afterRendering a menudo ya no es suficiente por sí solo, y probablemente tendrá que ser complementado mediante la conexión a señales adicionales, tales como beforeRenderPassRecording() o afterRenderPassRecording().
  • Las aplicaciones que dependen de las señales QQuickWindow::beforeRendering() o afterRendering() para emitir su propio conjunto de comandos de renderizado OpenGL deberían llamar a QQuickWindow::beginExternalCommands() antes, y a QQuickWindow::endExternalCommands() después, de las llamadas OpenGL. Esto asegura que los cambios de estado realizados por el código de la aplicación no lleven a confusión con respecto al propio estado en caché del renderizador del gráfico de escena. Nótese, sin embargo, que, al igual que en Qt 5, cambiar el estado de OpenGL 3.x o 4.x que no es utilizado por el renderizador Qt Quick puede dar lugar a problemas inesperados, por lo que se aconseja a la aplicación que restablezca cualquier estado de OpenGL al valor por defecto antes de volver de las ranuras o lambdas conectadas a estas señales.
  • Las sobrecargas existentes QQuickWindow::setRenderTarget(), y los getters relacionados, se eliminan y se sustituyen por una nueva función que toma un QQuickRenderTarget. Ahora se espera que las aplicaciones que realizan renderizado redirigido en combinación con QQuickRenderControl utilicen esta nueva función para especificar el objetivo de renderizado de una manera que no esté vinculada a OpenGL.
  • La sobrecarga QQuickWindow::setSceneGraphBackend() que toma un argumento QSGRendererInterface::GraphicsApi ha sido renombrada a setGraphicsApi().
  • Las funciones QQuickWindow setPersistentOpenGLContext e isPersistentOpenGLContext han cambiado de nombre, y ahora son QQuickWindow::setPersistentGraphics() y QQuickWindow::isPersistentGraphics().
  • setClearBeforeRendering() y clearBeforeRendering() se han eliminado de QQuickWindow. En Qt 6 no existe la opción de saltarse la limpieza del búfer de color. Llamar a setClearBeforeRendering() era a menudo necesario en Qt 5 en combinación con los underlays, para evitar que Qt Quick borrara el contenido renderizado en el buffer de color. En Qt 6, hay un enfoque más robusto: conectarse a la señal beforeRenderPassRecording(), que se emite después de borrar, pero antes de renderizar el contenido de Qt Quick.
  • La función QQuickWindow::openglContext() ha sido eliminada. Cuando la aplicación se ha asegurado de que el gráfico de la escena utiliza OpenGL para el renderizado, puede consultar el QOpenGLContext desde QSGRendererInterface::getResource().
  • La señal QQuickWindow::openglContextCreated() ha sido eliminada.
  • La función obsoleta QQuickWindow::createTextureFromId() ha sido eliminada. En su lugar, utilice la función fromNative() de QPlatformInterface::QSGOpenGLTexture, QPlatformInterface::QSGVulkanTexture, QPlatformInterface::QSGD3D11Texture, o QPlatformInterface::QSGMetalTexture.
  • La clase QQuickFramebufferObject está disponible con una API sin cambios, pero sólo es funcional cuando el scenegraph está renderizando con OpenGL. No será funcional cuando se utilice otra API gráfica, como Vulkan o Metal. Las aplicaciones que dependen de QQuickFramebufferObject deben forzar el uso de OpenGL llamando a QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL) en su función main().
  • QQuickRenderControl tiene una API ligeramente modificada: grab() ha sido eliminada, utilice QQuickWindow::grabWindow() en su lugar, cuando sea aplicable. La función initialize() ya no toma un QOpenGLContext. Ahora también se requiere que las aplicaciones llamen a QQuickRenderControl::beginFrame() y QQuickRenderControl::endFrame() según corresponda. Cuando se desee realizar un muestreo múltiple, deberá llamarse a la nueva función QQuickRenderControl::setSamples() para indicar el recuento de muestras.
  • Las aplicaciones que deseen realizar el renderizado Qt Quick en combinación con un dispositivo gráfico nativo existente o un objeto de contexto deben utilizar la nueva función QQuickWindow::setGraphicsDevice(), ya que QQuickRenderControl ya no proporciona la función initialize(QOpenGLContext*).
  • Establecer QQuickPaintedItem y Context2D en el modo Framebuffer no tiene ningún efecto. Se comportará como si el modo estuviera establecido en el modo Imagen por defecto.
  • La variable de entorno QSG_NO_DEPTH_BUFFER todavía se admite en Qt 6.0, pero se recomienda sustituir su uso llamando a setDepthBufferFor2D() en un QQuickGraphicsConfiguration que luego se asocia con el QQuickWindow.

Cambios en las API de QSG

  • QSGMaterialShader tiene una interfaz modificada. Las implementaciones ya no deben depender de OpenGL, y no pueden asumir que las funciones, como la ahora eliminada updateState(), se llaman con una corriente QOpenGLContext. En la nueva interfaz orientada a los datos, updateState() se sustituye por updateUniformData(), updateSampledImage() y updateGraphicsPipelineState(). En lugar del código de sombreado GLSL proporcionado como cadenas, ahora se espera que los sombreadores sean preprocesados por las herramientas del módulo Qt Shader Tools, como la herramienta de línea de comandos qsb, garantizando así que los activos de sombreado sean utilizables independientemente de la API gráfica (Vulkan, Metal, OpenGL o Direct 3D) que se utilice en tiempo de ejecución.
  • Se ha eliminado QSGEngine. En el improbable caso de que una aplicación utilice esta clase, se recomienda migrar a QQuickRenderControl en su lugar.
  • QSGAbstractRenderer ya no es público. El uso de esta clase sólo tenía sentido en combinación con QSGEngine, y con la eliminación de esa clase QSGAbstractRenderer ha vuelto a ser privada.
  • La clase de conveniencia QSGSimpleMaterial ha sido eliminada. Se espera que las aplicaciones utilicen en su lugar las API revisadas e independientes de OpenGL QSGMaterial.
  • Para acceder al objeto de textura nativo subyacente para un QSGTexture, textureId() ya no está disponible. En su lugar, utilice QSGTexture::platformInterface() con QPlatformInterface::QSGOpenGLTexture, QPlatformInterface::QSGVulkanTexture, QPlatformInterface::QSGD3D11Texture, o QPlatformInterface::QSGMetalTexture.
  • Las subclases de QSGImageNode ahora deben anular las nuevas virtuales adicionales, como setAnisotropyLevel() y anisotropyLevel().
  • Es probable que sea necesario rediseñar las subclases de QSGTexture. Algunas de las funciones virtuales específicas de OpenGL, como bind() o updateBindOptions(), ya no están presentes, mientras que hay nuevos virtuales que es obligatorio implementar, como comparisonKey().

Cambios en el uso de OpenGL en Qt Quick

Aunque no supondrá ninguna interrupción para muchas aplicaciones, los desarrolladores de aplicaciones deben ser conscientes de que, OpenGL ya no es siempre la opción por defecto para el renderizado de Qt Quick en Qt 6. A menos que se utilice el backend software, una aplicación Qt Quick podría utilizar OpenGL, Vulkan, Metal o Direct3D 11 en tiempo de ejecución. Cuando no se realiza una solicitud explícita, ya sea a través de la variable de entorno QSG_RHI_BACKEND o de la función QQuickWindow::setSceneGraphBackend(), Qt Quick elige un valor predeterminado específico de la plataforma.

Para obtener más información, visite las páginas Qt Quick Scene Graph y Qt Quick Scene Graph Default Renderer.

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