En esta página

Compositor IVI

IVI Compositor es un ejemplo que demuestra cómo utilizar la extensión IviApplication.

Introducción

Este ejemplo demuestra el uso de la extensión de shell IviApplication en un servidor de visualización Wayland (también conocido como compositor Wayland).

Para una introducción a los principios básicos de la creación de un Qt Wayland Compositor con Qt, vea el ejemplo Mínimo QML.

El Protocolo

IviApplication es una extensión de shell que se diseñó específicamente para crear sistemas de infoentretenimiento In-vehice.

Es un protocolo minimalista, y sólo proporciona la siguiente funcionalidad:

  1. El cliente puede identificarse con un IVI-id.
  2. El servidor puede solicitar que el cliente se redimensione.
Los números de identificación

En una configuración típica de IviApplication, tendrá un conjunto predefinido de aplicaciones que pueden conectarse al servidor. Como estas aplicaciones ya se conocen cuando se diseña el sistema, se les pueden asignar números codificados que las identifiquen. Dado que el cliente y el servidor se ponen de acuerdo de antemano sobre estos números, se puede incorporar semántica a los números de identificación.

Por ejemplo, si un cliente se identifica como la aplicación de navegación, el servidor puede reconocerlo y asignarle una parte grande y centrada de la pantalla para su ventana. Una aplicación que se identifique como reloj, por otro lado, podría ser delegada a un área más pequeña en los márgenes de la pantalla.

Por defecto, las aplicaciones Qt anunciarán sus PIDs del sistema ("process IDs") como el IVI-id. El cliente puede anular esto estableciendo QT_IVI_SURFACE_ID en su entorno antes de conectarse al servidor.

Ejemplo

Un Qt Wayland Compositor puede soportar múltiples extensiones de shell a la vez, pero el ejemplo de IVICompositor sólo soporta el protocolo IviApplication. Esto significa que los clientes también tienen que soportar esta extensión de shell para poder conectarse al servidor.

La ventana del compositor en el ejemplo está dividida en dos horizontalmente: Un área izquierda que está designada para una aplicación especializada con el id "1337", y un área derecha que es para todas las demás aplicaciones.

Creación del diseño

La disposición de la ventana se crea dentro de un WaylandOutput. Esto corresponde típicamente a una pantalla física disponible para el compositor. Si se crea un único WaylandOutput, como en el ejemplo de IVICompositor, normalmente corresponderá a la pantalla principal.

WaylandOutput {
    sizeFollowsWindow: true
    window: Window {
        width: 1024
        height: 768
        visible: true
        Rectangle {
            id: leftArea
            width: parent.width / 2
            height: parent.height
            anchors.left: parent.left
            color: "cornflowerblue"
            Text {
                anchors.centerIn: parent
                text: "Ivi surface with id 1337"
            }
        }
        Rectangle {
            id: rightArea
            width: parent.width / 2
            height: parent.height
            anchors.right: parent.right
            color: "burlywood"
            Text {
                anchors.centerIn: parent
                text: "Other surfaces"
            }
        }
    }
}

El código crea un WaylandOutput para la pantalla y crea una Ventana en ella como contenedor de nivel superior de todos los contenidos del compositor. Dentro de esta ventana, crea dos rectángulos que servirán como contenedores para las aplicaciones a medida que se conectan.

Conexión de clientes

Si no se ha realizado ninguna configuración adicional, una aplicación Qt se conectará con un IVI-id igual a su ID de proceso. Por ejemplo, si ejecutamos otra aplicación Qt de ejemplo con -platform wayland, será delegada a la parte derecha del layout, siempre que su ID sea diferente de "1337".

Sin embargo, si establecemos la variable de entorno QT_IVI_SURFACE_ID a "1337" antes de iniciar el ejemplo, se delegará a la parte izquierda del diseño.

Cuando un cliente se conecte a la interfaz IVIApplication, emitirá la señal iviSurfaceCreated. Aquí es donde se gestiona el posicionamiento de la superficie de la aplicación.

IviApplication {
    onIviSurfaceCreated: (iviSurface) =>  {
        var surfaceArea = iviSurface.iviId === 1337 ? leftArea : rightArea;
        var item = chromeComponent.createObject(surfaceArea, { "shellSurface": iviSurface } );
        item.handleResized();
    }
}

La señal iviSurfaceCreated recibe un argumento IviSurface que puede utilizarse para acceder al ID del cliente. A continuación, el compositor crea un ShellSurfaceItem para la superficie (tal y como se define en chromeComponent). ShellSurfaceItem es la clase utilizada para colocar superficies de concha en la escena Qt Quick, y verá este mismo patrón en todos los ejemplos Qt Wayland Compositor.

Lo que hace especial al ejemplo de IVICompositor es que comprueba la propiedad iviId de la superficie de concha entrante y decide un padre para la ShellSurfaceItem dependiendo de cuál sea. Si el ID es igual a "1337" será emparentado al leftArea, y si no lo es estará en el rightArea.

La implementación de ShellSurfaceItem gestiona el redimensionamiento informando al cliente cada vez que cambia el tamaño (lo que puede ocurrir si el compositor se ejecuta dentro de un sistema de ventanas tipo escritorio y su ventana cambia de tamaño).

onWidthChanged: handleResized()
onHeightChanged: handleResized()
function handleResized() {
    if (width > 0 && height > 0)
        shellSurface.sendConfigure(Qt.size(width, height));
}

El método sendConfigure() está definido en IviSurface y enviará un evento al cliente. El cliente recibirá un evento de redimensionamiento con el nuevo tamaño, para que pueda retransmitir su contenido.

Si varias aplicaciones se conectan a la misma área en el diseño, simplemente se apilarán de acuerdo con las reglas normales de ordenación de Qt Quick. No hay mecanismos incorporados para el cierre de aplicaciones o la gestión del estado, pero esto puede ser fácilmente añadido como código ordinario Qt Quick.

Proyecto de ejemplo @ code.qt.io

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