Auf dieser Seite

IVI Compositor

IVI Compositor ist ein Beispiel, das die Verwendung der Erweiterung „ IviApplication “ veranschaulicht.

Einführung

Dieses Beispiel veranschaulicht die Verwendung der Shell-Erweiterung „ IviApplication “ in einem Wayland-Display-Server (auch als Wayland-Compositor bezeichnet).

Eine Einführung in die Grundlagen der Erstellung eines Qt Wayland Compositor mit Qt finden Sie im Beispiel „Minimal QML“.

Das Protokoll

IviApplication ist eine Shell-Erweiterung, die speziell für die Entwicklung von Infotainment-Systemen in Fahrzeugen konzipiert wurde.

Es handelt sich um ein minimalistisches Protokoll, das lediglich die folgenden Funktionen bereitstellt:

  1. Der Client kann sich mit einer IVI-ID identifizieren.
  2. Der Server kann vom Client verlangen, dass dieser seine Größe anpasst.
Die Identifikationsnummern

In einer typischen „ IviApplication “-Konfiguration gibt es einen vordefinierten Satz von Anwendungen, die eine Verbindung zum Server herstellen können. Da diese Anwendungen bereits bei der Konzeption des Systems bekannt sind, können ihnen fest codierte Nummern zugewiesen werden, die sie identifizieren. Da sich Client und Server im Voraus auf diese Nummern einigen, lassen sich semantische Bedeutungen in die ID-Nummern einbauen.

Wenn sich ein Client beispielsweise als Navigationsanwendung identifiziert, kann der Server dies erkennen und seinem Fenster einen großen, zentral gelegenen Bereich des Bildschirms zuweisen. Eine Anwendung, die sich hingegen als Uhr identifiziert, könnte in einen kleineren Bereich am Rand des Bildschirms verlegt werden.

Standardmäßig geben Qt-Anwendungen ihre System-PIDs („Prozess-IDs“) als IVI-ID an. Der Client kann dies überschreiben, indem er vor der Verbindung mit dem Server in seiner Umgebung die Variable „ QT_IVI_SURFACE_ID “ setzt.

Das Beispiel

Ein „ Qt Wayland Compositor “ kann mehrere Shell-Erweiterungen gleichzeitig unterstützen, das Beispiel „IVICompositor“ unterstützt jedoch nur das Protokoll „ IviApplication “. Das bedeutet, dass die Clients diese Shell-Erweiterung ebenfalls unterstützen müssen, um eine Verbindung zum Server herstellen zu können.

Das Compositor-Fenster im Beispiel ist horizontal in zwei Bereiche unterteilt: einen linken Bereich, der für eine spezielle Anwendung mit der ID „1337“ vorgesehen ist, und einen rechten Bereich für alle anderen Anwendungen.

Das Compositor-Fenster ist horizontal geteilt, wobei der linke Bereich der Anwendungs-ID „1337“ und der rechte Bereich anderen Anwendungen zugeordnet ist.

Erstellen des Layouts

Das Layout des Fensters wird innerhalb eines „ WaylandOutput “ erstellt. Dies entspricht in der Regel einem physischen Bildschirm, der dem Compositor zur Verfügung steht. Wird ein einzelnes „ WaylandOutput “ erstellt, wie im IVICompositor-Beispiel, entspricht dies üblicherweise dem primären Bildschirm.

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"
            }
        }
    }
}

Der Code erstellt ein ` WaylandOutput ` für den Bildschirm und darauf ein Fenster als obersten Container für alle Inhalte des Compositors. Innerhalb dieses Fensters werden zwei Rechtecke erstellt, die als Container für Anwendungen dienen, sobald diese eine Verbindung herstellen.

Clients verbinden

Wenn keine zusätzliche Konfiguration vorgenommen wurde, verbindet sich eine Qt-Anwendung mit einer IVI-ID, die ihrer Prozess-ID entspricht. Wenn wir beispielsweise eine weitere Qt-Beispielanwendung mit ` -platform wayland` ausführen, wird sie auf die rechte Seite des Layouts delegiert, vorausgesetzt, ihre ID unterscheidet sich von „1337“.

Compositor-Fenster mit Beschriftung und Textfeld auf der rechten Seite

Wenn wir jedoch vor dem Start des Beispiels die Umgebungsvariable ` QT_IVI_SURFACE_ID ` auf „1337“ setzen, wird sie auf die linke Seite des Layouts verlagert.

Compositor-Fenster mit Beschriftung und Textfeld auf der linken Seite

Wenn ein Client eine Verbindung zur Schnittstelle ` IVIApplication ` herstellt, sendet er das Signal ` iviSurfaceCreated ` aus. Hier wird die Positionierung der Oberfläche der Anwendung gesteuert.

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

Das Signal „ iviSurfaceCreated “ erhält ein Argument vom Typ „ IviSurface “, über das auf die ID des Clients zugegriffen werden kann. Der Compositor erstellt daraufhin einen „ ShellSurfaceItem “ für die Oberfläche (wie durch „ chromeComponent “ definiert). „ ShellSurfaceItem “ ist die Klasse, die zum Einfügen von Shell-Oberflächen in die „ Qt Quick “-Szene verwendet wird, und dieses Muster findet sich in allen Beispielen unter Qt Wayland Compositor wieder.

Das Besondere am IVICompositor-Beispiel ist, dass es die Eigenschaft „ iviId “ der eingehenden Shell-Oberfläche überprüft und je nach deren Wert über einen übergeordneten Knoten für die „ ShellSurfaceItem “ entscheidet. Ist die ID gleich „1337“, wird sie dem „ leftArea “ untergeordnet, andernfalls dem „ rightArea “.

Die Implementierung von „ ShellSurfaceItem “ handhabt die Größenänderung, indem sie den Client bei jeder Größenänderung benachrichtigt (was passieren kann, wenn der Compositor in einem Windowsystem im Desktop-Stil läuft und dessen Fenster in der Größe verändert wird).

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

Die Methode ` sendConfigure() ` ist in ` IviSurface ` definiert und sendet ein Ereignis an den Client. Der Client erhält ein Größenänderungsereignis mit der neuen Größe, sodass er seinen Inhalt neu anordnen kann.

Wenn mehrere Anwendungen eine Verbindung zu demselben Bereich im Layout herstellen, werden sie einfach gemäß den üblichen Regeln für die Reihenfolge von ` Qt Quick ` übereinandergestapelt. Es gibt keine integrierten Mechanismen zum Schließen von Anwendungen oder zur Verwaltung des Zustands, dies lässt sich jedoch leicht als gewöhnlicher ` Qt Quick `-Code hinzufügen.

Beispielprojekt @ 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.