Auf dieser Seite

Multi Screen

Multi Screen ist ein Wayland-Compositor im Desktop-Stil für mehrere Bildschirme.

Einführung

Multi-Screen ist ein Beispiel für einen Wayland-Compositor im Desktop-Stil für mehrere Bildschirme.

Mehrere Compositor-Fenster, die zu einer einheitlichen Anzeige zusammengefasst sind

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

Unterstützung mehrerer Bildschirme

Für jeden im System verfügbaren Bildschirm erstellt das Beispiel ein ` CompositorScreen`, eine Unterklasse von ` WaylandOutput`. Ist nur ein physischer Bildschirm verfügbar, emuliert das Beispiel drei Bildschirme mit Dummy-Daten.

Instantiator {
    id: screens
    model: emulated ? emulatedScreens : Qt.application.screens

    delegate: CompositorScreen {
        surfaceArea.color: "lightsteelblue"
        text: name
        compositor: comp
        screen: emulated ? Qt.application.screens[0] : modelData
        Component.onCompleted: if (!comp.defaultOutput) comp.defaultOutput = this
        position: Qt.point(virtualX, virtualY)
        windowed: emulated
    }
}

Jedes „ WaylandOutput “ enthält ein „Window“, das zur Darstellung von Client-Inhalten dient, wie es bei der Standardkonfiguration mit Qt Wayland Compositor. Da jedes „Window“ von den anderen isoliert ist, können wir keine „ Qt Quick “-Elemente zwischen ihnen gemeinsam nutzen. Wenn sich also ein Client verbindet und ein „ ShellSurface “ erstellt wird, wird auf jedem der Bildschirme ein „ ShellSurfaceItem “ erstellt.

for (var i = 0; i < screens.count; ++i)
    createShellSurfaceItem(shellSurface, moveItem, screens.objectAt(i));

Diese Elemente dienen als Ansichten desselben Client-Inhalts. Die Oberfläche des Clients selbst wird nur einmal erstellt und von den Oberflächenelementen gemeinsam genutzt.

Oberflächenelemente der obersten Ebene werden in jedem der Ausgänge als untergeordnete Elemente des Hintergrund- Rectangle s erstellt. Diese Ansichten werden für später gespeichert, und wenn der Client untergeordnete Fenster erzeugt, werden diese dem Element des Fensters der obersten Ebene untergeordnet.

var parentSurfaceItem = output.viewsBySurface[shellSurface.parentSurface];
var parent = parentSurfaceItem || output.surfaceArea;

Der Client-Inhalt ist jeweils nur auf einem oder zwei Bildschirmen sichtbar. Die Positionen der „ ShellSurfaceItem “ werden so synchronisiert, dass Fenster, wenn sie auf einem Bildschirm erscheinen, gleichzeitig von einem anderen Bildschirm entfernt werden. Dadurch entsteht der Eindruck eines einzigen Elements, das sich nahtlos zwischen den Bildschirmen bewegt. Die globale Position des Clients wird in einem gemeinsam genutzten „ moveItem “ gespeichert, und die relative Position des „ ShellSurfaceItem “ jedes Bildschirms wird auf dieser Grundlage berechnet. Befindet sich das „ moveItem “ derzeit außerhalb der Grenzen eines Bildschirms, spiegeln seine Koordinaten dies wider, und es ist auf diesem Bildschirm nicht sichtbar.

x: surfaceItem.moveItem.x - surfaceItem.output.geometry.x
y: surfaceItem.moveItem.y - surfaceItem.output.geometry.y

Schließlich wird zu geeigneten Zeitpunkten WaylandQuickItem::setPrimary() aufgerufen, um die primäre Ansicht für den „ ShellSurface “ festzulegen, die verwendet wird, wenn der Client die Maximierung oder den Vollbildmodus anfordert. Die primäre „ ShellSurfaceItem “ wird danach ausgewählt, wie viel davon derzeit sichtbar ist.

Hinweis: Um mehrere Wayland-Ausgänge im selben Compositor zu unterstützen, muss das Attribut ` Qt::AA_ShareOpenGLContexts ` gesetzt werden, bevor das ` QGuiApplication `-Objekt erstellt wird. Im Beispiel erfolgt dies ganz am Anfang der Funktion ` main() `.

QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true);

Beispielprojekt @ code.qt.io

Siehe auch „Multi Output“.

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