Minimal QML
„Minimal QML“ ist ein einfaches Beispiel, das zeigt, wie man einen Wayland-Compositor in QML schreibt.
„Minimal QML“ ist ein Beispiel für einen Wayland-Compositor im Desktop-Stil, der mit möglichst wenig Code ein vollständiges „ Qt Wayland Compositor “ implementiert. Der Compositor wird mit „ Qt Quick “ und QML implementiert.

Das WaylandCompositor-Objekt
Das oberste Element des Compositors ist ein „ WaylandCompositor “. Dieser repräsentiert den Wayland-Server selbst und verwaltet die Verbindungen zu den Clients, sobald diese eingehen.
Standardmäßig unterstützt der Server das Kernprotokoll von Wayland für die Kommunikation mit Clients. In der Regel werden Sie jedoch auch eine oder mehrere Erweiterungen des Protokolls unterstützen wollen. Dies gibt dem Client mehr Möglichkeiten, seine Rolle im Fenstersystem zu beeinflussen.
Qt unterstützt mehrere Standard- und gängige Erweiterungen. Darüber hinaus ist es einfach, benutzerdefinierte Erweiterungen zu erstellen und zu unterstützen, sofern die Unterstützung sowohl im Client- als auch im Server-Code hinzugefügt werden kann.
Shell-Erweiterungen
In der Regel unterstützt ein Compositor mindestens eine Shell-Erweiterung. Erweiterungen werden dem Compositor hinzugefügt, indem sie als direkte untergeordnete Elemente des Objekts ` WaylandCompositor ` instanziiert werden. Sie werden automatisch der Eigenschaft ` extensions ` hinzugefügt und an Clients gesendet, sobald diese eine Verbindung herstellen.
WlShell {
onWlShellSurfaceCreated: (shellSurface) => shellSurfaces.append({shellSurface: shellSurface});
}
XdgShell {
onToplevelCreated: (toplevel, xdgSurface) => shellSurfaces.append({shellSurface: xdgSurface});
}
IviApplication {
onIviSurfaceCreated: (iviSurface) => shellSurfaces.append({shellSurface: iviSurface});
}Das Beispiel „Minimal QML “ unterstützt drei verschiedene Shells: „ WlShell “, „ XdgShell “ und „ IviApplication “.
Ein Client kann eine Verbindung zu einer dieser Shells herstellen, die dann als Kanal für die Kommunikation zwischen dem Client und dem Compositor dient, beispielsweise zum Erstellen neuer Fenster, zum Aushandeln der Größe und so weiter.
Wenn ein Client eine neue Oberfläche erstellt, erhält seine aktive Erweiterung ein entsprechendes Signal. Das Signal enthält ein Argument vom Typ „ ShellSurface “. Je nachdem, welche Erweiterung das Signal empfangen hat, handelt es sich bei diesem Argument um eine Unterklasse von „ ShellSurface “: „ WlShellSurface “, „ XdgSurface “ bzw. „ IviSurface “.
Über die ` ShellSurface ` kann auf Funktionen der Shell-Erweiterung für die jeweilige Oberfläche zugegriffen werden. Im Minimal-QML-Beispiel möchten wir den Client einfach zu unserer Szene hinzufügen. Um das Vorhandensein des neuen Fensters zu dokumentieren, fügen wir es zur Sicherheit einem einfachen ` ListModel ` hinzu.
ListModel { id: shellSurfaces }Erstellen der Szene
Der größte Teil des erforderlichen Compositor-Codes ist bereits fertig. Der letzte Schritt besteht darin, sicherzustellen, dass Anwendungen tatsächlich auf dem Bildschirm sichtbar sind.
Für alle Compositoren müssen wir mindestens eine Ausgabe definieren. Dies geschieht durch die Instanziierung eines „ WaylandOutput “-Objekts als direktes untergeordnetes Element des „ WaylandCompositor “. Wenn es nur eine einzige Ausgabe gibt, stellt diese den primären Bildschirm des Systems dar. (Sie können auch mehrere „ WaylandOutput “-Objekte erstellen, um mehrere Bildschirme anzusprechen, sofern diese verfügbar sind. Weitere Details hierzu finden Sie im Beispiel „Multi Screen “.)
WaylandOutput {
sizeFollowsWindow: true
window: Window {
width: 1024
height: 768
visible: trueInnerhalb des „ WaylandOutput “ erstellen wir ein „Window“, das als Container für unsere Szene dient. Im Beispiel legen wir hierfür eine Größe fest. Diese Größe wird verwendet, wenn der Compositor als Anwendung innerhalb eines anderen Fenstersystems läuft, das Fenster mit benutzerdefinierten Abmessungen unterstützt. In einem typischen Anwendungsfall auf einem eingebetteten Gerät, bei dem der Compositor der einzige laufende Display-Server ist, wird er wahrscheinlich auf einem Vollbild-Plattform-Plugin (wie z. B. eglfs) ausgeführt, und die hier festgelegte Größe spielt keine Rolle.
Der letzte Schritt besteht darin, Elemente für jedes der erstellten „ ShellSurface “-Objekte zu erstellen. Dazu können wir die Klasse „ ShellSurfaceItem “ verwenden.
Repeater {
model: shellSurfaces
// ShellSurfaceItem handles displaying a shell surface.
// It has implementations for things like interactive
// resize/move, and forwarding of mouse and keyboard
// events to the client process.
ShellSurfaceItem {
shellSurface: modelData
onSurfaceDestroyed: shellSurfaces.remove(index)
}
}Wir erstellen für jede der Shell-Oberflächen in unserem Modell ein „ ShellSurfaceItem “ und weisen es der Eigenschaft „ shellSurface “ zu. Außerdem stellen wir sicher, dass das Modell aktualisiert wird, wenn die Shell-Oberfläche zerstört wird. Dies kann passieren, wenn ein Client ein Fenster manuell schließt oder wenn das Programm beendet wird oder abstürzt.
Und das ist bereits der gesamte Code, der benötigt wird, um einen funktionsfähigen Wayland-Compositor mit „ Qt Quick “ und QML zu erstellen. Ein weiteres Beispiel für einen in QML geschriebenen Compositor, der jedoch über einige zusätzliche Funktionen verfügt, finden Sie im Beispiel „Fancy Compositor“.
© 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.