Los cambios introducidos en Qt Quick Controls
Qt 6 son el resultado del esfuerzo consciente por hacer el framework más eficiente y fácil de usar.
Intentamos mantener la compatibilidad de todas las API públicas en cada versión. Algunos cambios fueron inevitables en un esfuerzo por hacer de Qt un mejor framework.
En este tema resumimos esos cambios en Qt Quick Controls, y proporcionamos una guía para manejarlos.
Migración desde Qt Quick Controls 1
Qt Quick Controls 1 fue obsoleto en Qt 5.11 y ha sido eliminado de Qt 6.0. Utilice Qt Quick Controls (anteriormente conocido como Qt Quick Controls 2) en su lugar. Para más información, consulte el tema Qt 5.15: Qt Quick Controls vs Qt Quick Controls 1 en la documentación de Qt 5.
Cambios en el registro de tipos
Qt Quick Controls ha sufrido algunos cambios importantes, sobre todo internos, en Qt 6. Al hacer uso del registro de tipos mejorado introducido en Qt 5.15, allanamos el camino para la compilación de los archivos QML del módulo a C++ y permitimos que las herramientas sean más eficaces. En particular, el modelo de código QML de Qt Creator debería tener una imagen más completa de los tipos, haciendo más fiable su completado y la comprobación de errores del código Qt Quick Controls. Las herramientas de análisis estático como qmllint y qmlformat también se benefician al conocer los tipos que ahora se declaran en tiempo de compilación en C++.
Como resultado de estos cambios, algunas cosas se hacen de forma un poco diferente.
Los estilos personalizados son ahora módulos QML propiamente dichos
Para permitir el registro de tipos en tiempo de compilación, cada estilo de Qt Quick Controls es ahora un módulo QML propiamente dicho. Anteriormente, un simple Button.qml era suficiente para crear tu propio estilo. Aunque práctico, esto requería una API no estándar, que a su vez requería la adaptación de herramientas como Qt Designer.
Ahora, todos los tipos QML que implementa un estilo deben declararse en el archivo qmldir de ese estilo:
module MyStyle Button 1.0 Button.qml
Al unificar esto con el resto del mundo QML, los estilos resultan más familiares a los desarrolladores y, con suerte, más fáciles de entender para los principiantes. Como consecuencia, se ha tenido que eliminar la siguiente API:
- QQuickStyle::addStylePath()
- QQuickStyle::estilosdisponibles()
- QQuickStyle::ruta()
- QQuickStyle::stylePathList()
- QT_QUICK_CONTROLS_RUTA_DE_ESTILO
Ahora que los estilos deben encontrarse en la ruta de importación del motor QML como cualquier otro módulo QML, ya no es necesario ni posible soportar esta API.
Nombres de estilos
Además, ahora sólo hay una forma válida, que distingue entre mayúsculas y minúsculas, para los nombres de estilos: "Material", "MiEstilo", etc. Es decir: el nombre del estilo debe coincidir exactamente con el nombre del módulo QML. Esto también se aplica a los selectores de archivo, donde antes todos los nombres de estilo se escribían en minúsculas. Por ejemplo, donde lo siguiente era una estructura válida para un proyecto Qt 5:
MyProject
├── main.qml
├── HomePage.qml
└── +material
└───HomePage.qmlEn Qt 6, +material se convierte en +Material:
MyProject
├── main.qml
├── HomePage.qml
└── +Material
└───HomePage.qmlTodas las formas existentes para ejecutar una aplicación con un estilo específico siguen siendo compatibles.
Selección de estilos en tiempo de ejecución y compilación
Importar un estilo tiene ahora un significado extra debido a la forma en que las importaciones funcionan internamente. Antes, al importar QtQuick.Controls se registraban los tipos de control del estilo actual en el motor QML:
import QtQuick.Controls
Esto se denomina selección de estilo en tiempo de ejecución, ya que el estilo se selecciona en tiempo de ejecución.
La importación explícita de QtQuick.Controls.Material simplemente expondría cualquier API adicional proporcionada por ese estilo (por ejemplo, el tipo Material adjunto):
import QtQuick.Controls.Material
Ahora, importar explícitamente un estilo hace ambas cosas.
Esto significa que se utilizarán los tipos de control (como Button) del último estilo importado. Nos referimos a esto como selección de estilo en tiempo de compilación.
Esto tiene implicaciones para el código existente. Es decir, si su aplicación soporta más de un estilo, mueva estas importaciones a sus propios archivos QML que son seleccionados por archivo.
Por ejemplo, si tiene el siguiente main.qml:
import QtQuick.Controls import QtQuick.Controls.Material import QtQuick.Controls.Universal ApplicationWindow { width: 600 height: 400 visible: true Material.theme: darkMode ? Material.Dark : Material.Light Universal.theme: darkMode ? Universal.Dark : Universal.Light // Child items, etc. }
Puede mover el código común a un componente "base":
// MainWindow.qml import QtQuick.Controls ApplicationWindow {}
A continuación, añada un subdirectorio +Material, y en él, añada el código específico de Material en MainWindow.qml:
// +Material/MainWindow.qml import QtQuick.Controls.Material ApplicationWindow { Material.theme: darkMode ? Material.Dark : Material.Light }
Haga lo mismo para Universal:
// +Universal/MainWindow.qml import QtQuick.Controls.Universal ApplicationWindow { Universal.theme: darkMode ? Universal.Dark : Universal.Light }
Luego, en main.qml:
import QtQuick.Controls MainWindow { width: 600 height: 400 visible: true // Child items, etc. }
Ver también: Uso de selectores de archivos con Qt Quick Controls.
Estilo por defecto
El estilo Predeterminado fue renombrado a "Básico", pues ya no es el estilo predeterminado. En su lugar, el estilo por defecto se elige ahora en función de la plataforma para la que Qt fue construido:
- Android: Estilo Material
- Linux: Estilo Fusion
- macOS: Estilo macOS
- Windows: Estilo Windows
- Todas las demás plataformas: Estilo Básico
Por lo tanto, las aplicaciones que no especificaron un estilo en Qt 5 y tienen controles personalizados deben especificar explícitamente el estilo Basic en Qt 6 para asegurar que esos controles se vean y se comporten como lo hacían con Qt 5.
Paleta
La API de la paleta se ha movido a QQuickItem. Las diversas APIs que usan paletas en Qt Quick Controls no han cambiado.
Controles
Cambios en ApplicationWindow
Se han eliminado las propiedades de superposición y la API adjunta obsoletas. En su lugar, utilice el tipo attached de Overlay.
Cambios en ComboBox
La propiedad pressed es ahora de sólo lectura. Para modificar el estado visual pulsado de un ComboBox, utilice en su lugar la propiedad down.
Cambios en Container
Se ha eliminado la función obsoleta removeItem(var). removeItem En su lugar se puede utilizar (Item) o takeItem(int).
Cambios en Dialog
DialogLas señales accepted() y rejected() ahora se emiten antes que closed() cuando se llama a done(), accept() y reject().
Cambios en Menu
Se ha eliminado la función obsoleta removeItem(var). removeItem En su lugar se puede utilizar (Item) o takeItem(int).
Cambios en ToolTip
ToolTipEl tiempo de espera de ToolTip ahora comienza sólo después de que opened() ha sido emitido. De este modo, los tooltips con transiciones enter permanecen visibles durante toda la duración de la propiedad timeout. Esto significa que son visibles un poco más de lo que eran antes, por lo que puede valer la pena comprobar visualmente tooltips en su aplicación y ajustar los tiempos de espera si es necesario.
Cambios en StackView
El valor StackView.Transition enum ha quedado obsoleto. El argumento operación puede omitirse para utilizar la transición por defecto para cualquier operación dada.
Cambios en Tumbler
implicitWidth y implicitHeight deben proporcionarse ahora para Tumbler's contentItem, haciéndolo consistente con todos los demás controles.
© 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.