Mehrfachbildschirm

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

Einführung

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

Für eine Einführung in die Grundprinzipien der Erstellung eines Qt Wayland Compositor mit Qt, siehe das Minimal QML Beispiel.

Unterstützung für mehrere Bildschirme

Für jeden verfügbaren Bildschirm auf dem System erstellt das Beispiel einen CompositorScreen, der eine Unterklasse von WaylandOutput ist. Wenn nur ein physischer Bildschirm verfügbar ist, 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
    }
}

Jeder WaylandOutput enthält ein Window, das für die Aufnahme von Client-Inhalten verwendet wird, wie es der Standardaufbau mit Qt Wayland Compositor. Da jedes Fenster von den anderen isoliert ist, können wir keine Qt Quick Elemente zwischen ihnen austauschen. Wenn ein Client eine Verbindung herstellt und ein ShellSurface erstellt wird, wird daher 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 wird von den Oberflächenelementen gemeinsam genutzt.

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

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

Der Inhalt des Clients ist jeweils nur auf einem oder zwei Bildschirmen sichtbar. Die Positionen von ShellSurfaceItem werden synchronisiert, so dass Fenster, die einen Bildschirm betreten, gleichzeitig von einem anderen verschoben 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 der ShellSurfaceItem jedes Bildschirms wird auf der Grundlage dieser Position berechnet. Befindet sich moveItem derzeit außerhalb der Grenzen eines Bildschirms, spiegeln seine Koordinaten dies wider, und es wird auf diesem Bildschirm nicht sichtbar sein.

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

Schließlich wird WaylandQuickItem::setPrimary() zu geeigneten Zeitpunkten aufgerufen, um die primäre Ansicht für ShellSurface festzulegen, die verwendet wird, wenn der Client eine Maximierung oder Vollbilddarstellung wünscht. Die primäre Ansicht ShellSurfaceItem wird danach ausgewählt, wie viel von ihr gerade sichtbar ist.

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

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

Beispielprojekt @ code.qt.io

Siehe auch Multi Output.

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