Sur cette page

Écran multiple

Multi Screen est un compositeur Wayland de style bureau pour plusieurs écrans.

Introduction

Multi-Screen est un exemple de compositeur Wayland pour plusieurs écrans.

Pour une introduction aux principes de base de la création d'une interface graphique avec Qt, voir l'exemple QML minimal. Qt Wayland Compositor avec Qt, voir l'exemple Qtml minimal.

Prise en charge de plusieurs écrans

Pour chaque écran disponible sur le système, l'exemple crée un CompositorScreen, qui est une sous-classe de WaylandOutput. S'il n'y a qu'un seul écran physique disponible, l'exemple émule trois écrans avec des données fictives.

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

Chaque WaylandOutput contient une fenêtre, qui est utilisée pour contenir le contenu du client, comme c'est le cas avec la configuration standard de Qt Wayland Compositor. Comme chaque fenêtre est isolée des autres, nous ne pouvons pas partager d'éléments Qt Quick entre elles. Par conséquent, lorsqu'un client se connecte et qu'un ShellSurface est créé, un ShellSurfaceItem est créé sur chacun des écrans.

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

Ces éléments servent de vues du même contenu du client. La surface du client elle-même ne sera créée qu'une seule fois et sera partagée par les éléments de surface.

Les éléments de surface de niveau supérieur sont créés en tant qu'enfants de l'arrière-plan Rectangle dans chacune des sorties. Ces vues sont stockées pour plus tard, et si le client crée des fenêtres enfants, celles-ci sont rattachées à l'élément de la fenêtre de niveau supérieur.

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

Le contenu du client ne sera visible que sur un ou deux écrans à la fois. ShellSurfaceItem Les positions sont synchronisées de sorte que lorsque les fenêtres entrent dans un écran, elles sont déplacées d'un autre en même temps. Cela donne l'impression d'un élément unique qui se déplace de manière transparente d'un écran à l'autre. La position globale du client est stockée dans un moveItem partagé et la position relative du ShellSurfaceItem de chaque écran est calculée sur cette base. Si le site moveItem se trouve actuellement en dehors des limites d'un écran, ses coordonnées le refléteront et il ne sera pas visible sur cet écran.

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

Enfin, WaylandQuickItem::setPrimary() est appelé au moment opportun pour définir la vue principale de ShellSurface, qui est utilisée lorsque le client demande à être maximisé ou en plein écran. La vue principale ShellSurfaceItem est sélectionnée en fonction de la partie actuellement visible.

Remarque : afin de prendre en charge plusieurs sorties Wayland dans le même compositeur, l'attribut Qt::AA_ShareOpenGLContexts doit être défini avant que l'objet QGuiApplication ne soit construit. Dans l'exemple, nous le faisons au tout début de la fonction main().

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

Exemple de projet @ code.qt.io

Voir aussi 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.