Cambios en Qt Qml
Qt 6 es 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 Qml, y proporcionamos una guía para manejarlos.
Lenguaje QML
Resolución de URL
En Qt 5, las urls relativas eran a menudo, aunque de forma inconsistente, resueltas directamente, especialmente cuando se asignaban a una propiedad url. En Qt 6 esto ya no es así.
Si tenías un archivo QML almacenado en "/home/qml/ejemplo.qml", y "ejemplo.qml" contenía
property url imageFolder: "./images"entonces la propiedad url almacenaría la URL "/home/qml/images". Esto hacía imposible usar URLs relativas en QML de esta forma, así que en Qt 6, la URL permanece relativa, y sólo se resuelve cuando es necesario (por ejemplo, cuando se usa como fuente de un componente Image). Si dependes del comportamiento antiguo, puedes usar Qt.resolvedUrl
Por ejemplo, si tiene código como
property url imageFolder: "./images"puede reescribirlo como
property url imageFolder: Qt.resolvedUrl("./images")
Qt.resolvedUrl puede usarse tanto en Qt 5 como en Qt 6.
Como ayuda para la portabilidad, la variable de entorno QML_COMPAT_RESOLVE_URLS_ON_ASSIGNMENT se puede establecer en 1 para obtener el comportamiento de Qt 5. Esto es posible desde Qt 6.2.2. Sin embargo, se recomienda usar esto sólo para desbloquear un puerto, y usar Qt.resolvedUrl como se explicó anteriormente.
Propiedades variantes
variant marcadas como obsoletas desde Qt 5, se tratan ahora exactamente igual que las propiedades var. El código que dependía de la conversión implícita de cadenas activada en la asignación a propiedades variantes debe actualizarse para crear explícitamente un objeto del tipo correcto.
Por ejemplo, si tiene código como
property variant myColor: "red"puede reescribirlo como
property variant myColor: Qt.color("red")
Las conversiones implícitas se hacían para cadenas que podían ser interpretadas como
- color (use Qt.color en su lugar),
- date (usa el objeto Date en su lugar),
- rect (usar Qt.rect en su lugar) y
- size (utilizar Qt.size)
variant sigue siendo una palabra clave obsoleta en Qt 6, aunque se recomienda encarecidamente que el nuevo código utilice las propiedades var en su lugar.
Nota: Si se sabe que el tipo de la propiedad no va a cambiar, utilice una propiedad del tipo concreto, en lugar de una propiedad var.
Nota: Estas conversiones también se han aplicado a las propiedades QVariant de las clases registradas en el motor. Al igual que con las propiedades variant, el código que se basaba en conversiones implícitas de cadenas debe utilizar las funciones correspondientes del objeto Qt.
Cambios en la API incompatibles con la fuente
Cambios en la API
QQmlListProperty CountFunction y se han cambiado para utilizar en lugar de para alinearse con los cambios correspondientes en los contenedores de Qt. AtFunction qsizetype int
Por ejemplo, si tienes código como
int myCountFunction(QQmlListProperty<MyType> *); MyType *myAtFunction(QQmlListProperty<MyType> *, int); QQmlListProperty<MyType> myReadOnlyList(containingObject, container, &myCountFunction, &myAtFunction);
puede reescribirlo como
qsizetype myCountFunction(QQmlListProperty<MyType> *); MyType *myAtFunction(QQmlListProperty<MyType> *, qsizetype); QQmlListProperty<MyType> myReadOnlyList(containingObject, container, &myCountFunction, &myAtFunction);
El código que necesite soportar tanto Qt 5 como Qt 6 puede usar un typedef que es int en Qt 5 y qsizetype en Qt 6, o usar QList::size_type, que ya es un alias de tipo.
API eliminada
Se han eliminado varias funciones obsoletas.
- El constructor QQmlListProperty que toma una referencia ha sido eliminado.
Por ejemplo, si tienes código como
QQmlListProperty<QObject>(owner, owner->objectList);
puede reescribirlo como
QQmlListProperty<QObject>(owner, &owner->objectList);
- Las funciones
qmlDebug,qmlInfo,qmlWarning,qmlContextyqmlEnginesolían existir tanto en el espacio de nombres global (o espacio de nombres Qt en construcciones con espacio de nombres), como en el espacio de nombresQtQml. Ahora estas funciones sólo existen en el espacio de nombres global.Por ejemplo, si tienes código como
QQmlEngine *engine = QtQml::qmlEngine(qmlObject);
puede reescribirlo como
QQmlEngine *engine = qmlEngine(qmlObject);
- Se ha eliminado la sobrecarga
qmlRegisterTypeque no toma argumentos. UtiliceqmlRegisterAnonymousTypeen su lugar, o cambie al registro de tipos declarativo conQML_ANONYMOUS.Por ejemplo, si tienes código como
class AnonymousType : public QObject { // ... }; qmlRegisterType<AnonymousType>();
puede reescribirlo como
class AnonymousType : public QObject { // ... }; qmlRegisterAnonymousType<AnonymousType>("MyModule", 1);
O alternativamente
class AnonymousType : public QObject { QML_ANONYMOUS // ... };
- Se han eliminado las sobrecargas de
qmlRegisterExtendedTypeyqmlRegisterInterfaceque no toman ningún argumento de versión. Utilice las sobrecargas que proporcionan una versión, o cambie al registro de tipos declarativo con QML_EXTENDED y QML_INTERFACE.Por ejemplo, si tiene código como
struct GreetInterface { virtual ~GreetInterface(); virtual void greet(); }; Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface") qmlRegisterInterface<GreetInterface>("Greeter");
puede reescribirlo como
struct GreetInterface { virtual ~GreetInterface(); virtual void greet(); }; Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface") qmlRegisterInterface<GreetInterface>("Greeter", 1);
Alternativamente
struct GreetInterface { QML_INTERFACE(Greeter) virtual ~GreetInterface(); virtual void greet(); }; Q_DECLARE_INTERFACE(GreetInterface, "org.hi.GreetInterface")
Nota: En código nuevo, debe preferirse el registro de tipos declarativo.
- Se ha eliminado la función
QJSValue::engine. Si se requiere acceso al motor, debe almacenarse en su lugar una referencia al mismo. qmlAttachedPropertiesObjectByIdyqmlAttachedPropertiesObject(int *, const QObject *, const QMetaObject *, bool)han sido eliminadas. Utilice en su lugar la sobrecargaqmlAttachedPropertiesObject(QObject *, QQmlAttachedPropertiesFunc, bool)deqmlAttachedPropertiesObject.QJSEngine::installTranslatorFunctionsQJSEngine::installExtensionsestá disponible como reemplazo.Por ejemplo, si tiene código como
QJSEngine engine; engine.installTranslatorFunctions();
puede reescribirlo como
Véase también Modernizar módulos QML y Portar módulos QML a CMake.
© 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.