En esta página

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, qmlContext y qmlEngine solí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 nombres QtQml. 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 qmlRegisterType que no toma argumentos. Utilice qmlRegisterAnonymousType en su lugar, o cambie al registro de tipos declarativo con QML_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 qmlRegisterExtendedType y qmlRegisterInterface que 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.
  • qmlAttachedPropertiesObjectById y qmlAttachedPropertiesObject(int *, const QObject *, const QMetaObject *, bool) han sido eliminadas. Utilice en su lugar la sobrecarga qmlAttachedPropertiesObject(QObject *, QQmlAttachedPropertiesFunc, bool) de qmlAttachedPropertiesObject.
  • QJSEngine::installTranslatorFunctions QJSEngine::installExtensions está disponible como reemplazo.

    Por ejemplo, si tiene código como

    QJSEngine engine;
    engine.installTranslatorFunctions();

    puede reescribirlo como

    QJSEngine engine;
    engine.installExtensions(QJSEngine::TranslationExtension);

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.