En esta página

QQmlIncubator Class

La clase QQmlIncubator permite crear objetos QML de forma asíncrona. Más...

Cabecera: #include <QQmlIncubator>
CMake: find_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmake: QT += qml

Tipos Públicos

enum IncubationMode { Asynchronous, AsynchronousIfNested, Synchronous }
enum Status { Null, Ready, Loading, Error }

Funciones Públicas

QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)
void clear()
QList<QQmlError> errors() const
void forceCompletion()
QQmlIncubator::IncubationMode incubationMode() const
bool isError() const
bool isLoading() const
bool isNull() const
bool isReady() const
QObject *object() const
void setInitialProperties(const QVariantMap &initialProperties)
QQmlIncubator::Status status() const

Funciones protegidas

virtual void setInitialState(QObject *object)
virtual void statusChanged(QQmlIncubator::Status status)

Descripción detallada

La creación de objetos QML - como delegados en una vista, o una nueva página en una aplicación - puede llevar un tiempo considerable, especialmente en dispositivos móviles con recursos limitados. Cuando una aplicación utiliza QQmlComponent::create() directamente, la instancia del objeto QML se crea de forma sincrónica, lo que, dependiendo de la complejidad del objeto, puede provocar pausas o tartamudeos notables en la aplicación.

El uso de QQmlIncubator ofrece un mayor control sobre la creación de un objeto QML, lo que incluye la posibilidad de crearlo de forma asíncrona utilizando el tiempo de inactividad de la aplicación. El siguiente ejemplo muestra un uso simple de QQmlIncubator.

// Initialize the incubator
QQmlIncubator incubator;
component->create(incubator);

Deje que la incubadora se ejecute durante un tiempo (normalmente devolviendo el control al bucle de eventos) y, a continuación, sondeela. Hay varias maneras de volver a la incubadora más tarde. Es posible que desee conectarse a una de las señales enviadas por QQuickWindow, o puede que desee ejecutar un QTimer especialmente para eso. También puedes necesitar el objeto para algún propósito específico y sondear la incubadora cuando surja ese propósito.

// Poll the incubator
if (incubator.isReady()) {
    QObject *object = incubator.object();
    // Use created object
}

Las incubadoras asíncronas son controladas por un QQmlIncubationController que se establece en el QQmlEngine, que permite al motor saber cuando la aplicación está inactiva y los objetos de incubación deben ser procesados. Si no se establece un controlador de incubación en el QQmlEngine, QQmlIncubator crea objetos de forma sincrónica independientemente del IncubationMode especificado. Por defecto, no se establece ningún controlador de incubación. Sin embargo, QQuickView, QQuickWindow y QQuickWidget establecen controladores de incubación en sus respectivos QQmlEngines. Estos controladores de incubación espacian las incubaciones a lo largo de múltiples fotogramas mientras se renderiza la vista.

QQmlIncubator soporta tres modos de incubación:

  • Sincrónica La creación se produce de forma sincrónica. Es decir, una vez que la llamada QQmlComponent::create() retorna, la incubadora ya estará en estado Error o Listo. Una incubadora síncrona no tiene ninguna ventaja real en comparación con el uso de los métodos de creación síncrona en QQmlComponent directamente, pero puede simplificar la implementación de una aplicación para utilizar la misma API tanto para creaciones síncronas como asíncronas.
  • Asíncrono (por defecto) La creación se produce de forma asíncrona, asumiendo que se ha establecido un QQmlIncubatorController en QQmlEngine.

    La incubadora permanecerá en el estado Loading hasta que se complete la creación o se produzca un error. La llamada de retorno statusChanged() se puede utilizar para ser notificado de los cambios de estado.

    Las aplicaciones deberían utilizar el modo de incubación Asíncrono para crear objetos que no se necesiten inmediatamente. Por ejemplo, el tipo ListView utiliza la incubación asíncrona para crear objetos que están ligeramente fuera de la pantalla mientras se desplaza la lista. Si, durante la creación asíncrona, el objeto se necesita inmediatamente, se puede llamar al método QQmlIncubator::forceCompletion() para completar el proceso de creación de forma síncrona.

  • AsynchronousIfNested La creación se producirá de forma asíncrona si forma parte de una creación asíncrona anidada, o de forma síncrona en caso contrario.

    En la mayoría de los escenarios en los que un componente QML desea la apariencia de una instanciación síncrona, debería utilizar este modo.

    Este modo se explica mejor con un ejemplo. Cuando el tipo ListView se crea por primera vez, necesita poblarse con un conjunto inicial de delegados para mostrar. Si ListView tuviera 400 píxeles de alto y cada delegado tuviera 100 píxeles de alto, necesitaría crear cuatro instancias de delegado iniciales. Si el ListView utilizara el modo de incubación asíncrono, el ListView se crearía siempre vacío y, algún tiempo después, aparecerían los cuatro elementos iniciales.

    Por el contrario, si ListView utilizara el modo de incubación Síncrono se comportaría correctamente pero podría introducir tartamudeos en la aplicación. Como QML tendría que detenerse e instanciar los delegados de ListView de forma sincrónica, si ListView formara parte de un componente QML que se instanciara de forma asincrónica, esto anularía gran parte de las ventajas de la instanciación asincrónica.

    El modo AsynchronousIfNested resuelve este problema. Al utilizar AsynchronousIfNested, los delegados de ListView se instancian de forma asíncrona si el propio ListView ya forma parte de una instanciación asíncrona, y de forma síncrona en caso contrario. En el caso de una instanciación asíncrona anidada, la instanciación asíncrona externa no se completará hasta que todas las instancias anidadas también hayan finalizado. Esto garantiza que, para cuando finalice la instanciación asíncrona externa, los elementos internos como ListView ya hayan terminado de cargar sus delegados iniciales.

    Casi siempre es incorrecto utilizar el modo de incubación síncrono - los elementos o componentes que quieran la apariencia de la instanciación síncrona, pero sin los inconvenientes de introducir congelaciones o tartamudeos en la aplicación, deberían utilizar el modo de incubación AsynchronousIfNested.

Documentación de tipos de miembros

enum QQmlIncubator::IncubationMode

Especifica el modo en el que opera la incubadora. Independientemente del modo de incubación, QQmlIncubator se comportará de forma sincrónica si QQmlEngine no tiene configurado QQmlIncubationController.

ConstanteValorDescripción
QQmlIncubator::Asynchronous0El objeto se creará de forma asíncrona.
QQmlIncubator::AsynchronousIfNested1Si el objeto se está creando en un contexto que ya forma parte de una creación asíncrona, esta incubadora se unirá a esa incubación existente y se ejecutará de forma asíncrona. La incubación existente no estará Preparada hasta que tanto ella como esta incubación hayan finalizado. En caso contrario, la incubación se ejecutará de forma síncrona.
QQmlIncubator::Synchronous2El objeto se creará de forma sincrónica.

enum QQmlIncubator::Status

Especifica el estado de la QQmlIncubator.

ConstanteValorDescripción
QQmlIncubator::Null0La incubación no está en curso. Llame a QQmlComponent::create() para iniciar la incubación.
QQmlIncubator::Ready1El objeto está completamente creado y se puede acceder a él llamando a object().
QQmlIncubator::Loading2El objeto está en proceso de creación.
QQmlIncubator::Error3Se ha producido un error. Se puede acceder al error llamando a errors().

Documentación de las funciones miembro

QQmlIncubator::QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)

Crear una nueva incubadora con el mode

void QQmlIncubator::clear()

Borra la incubadora. Se interrumpe cualquier incubación en curso. Si la incubadora está en estado Listo, el objeto creado no se borra.

QList<QQmlError> QQmlIncubator::errors() const

Devuelve la lista de errores encontrados durante la incubación del objeto.

void QQmlIncubator::forceCompletion()

Fuerza a cualquier incubación en curso a finalizar de forma sincrónica. Una vez devuelta esta llamada, la incubadora no estará en estado Cargando.

QQmlIncubator::IncubationMode QQmlIncubator::incubationMode() const

Devuelve el modo de incubación pasado al constructor QQmlIncubator.

bool QQmlIncubator::isError() const

Devuelve true si status() de la incubadora es Error.

bool QQmlIncubator::isLoading() const

Devuelve true si el status() de la incubadora es Loading.

bool QQmlIncubator::isNull() const

Devuelve true si status() de la incubadora es Null.

bool QQmlIncubator::isReady() const

Devuelve true si el status() de la incubadora es Ready.

QObject *QQmlIncubator::object() const

Devuelve el objeto incubado si el estado es Listo, en caso contrario 0.

void QQmlIncubator::setInitialProperties(const QVariantMap &initialProperties)

Almacena un mapeo de nombres de propiedades a valores iniciales, contenidos en initialProperties, con los que se inicializará el componente incubado.

Véase también QQmlComponent::setInitialProperties.

[virtual protected] void QQmlIncubator::setInitialState(QObject *object)

Se llama después de que object se cree por primera vez, pero antes de que se evalúen los enlaces de propiedades complejas y, si procede, se llame a QQmlParserStatus::componentComplete(). Esto equivale al punto entre QQmlComponent::beginCreate() y QQmlComponent::completeCreate(), y puede utilizarse para asignar valores iniciales a las propiedades del objeto.

La implementación por defecto no hace nada.

Nota: Los enlaces simples, como los literales numéricos, se evalúan antes de llamar a setInitialState(). La categorización de los bindings en simples y complejos no está especificada intencionadamente y puede cambiar entre versiones de Qt y dependiendo de si se utiliza qmlcachegen y cómo. No se debe confiar en que un enlace en particular sea evaluado antes o después de llamar a setInitialState(). Por ejemplo, una expresión constante como MyType.EnumValue puede ser reconocida como tal en tiempo de compilación o diferida para ser ejecutada como binding. Lo mismo ocurre con expresiones constantes como -(5) o "a" + " cadena constante".

QQmlIncubator::Status QQmlIncubator::status() const

Devuelve el estado actual de la incubadora.

[virtual protected] void QQmlIncubator::statusChanged(QQmlIncubator::Status status)

Llamada cuando el estado de la incubadora cambia. status es el nuevo estado.

La implementación por defecto no hace nada.

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