Sur cette page

Gestion des sessions

Une session est un groupe d'applications en cours d'exécution, chacune ayant un état particulier. La session est contrôlée par un service appelé gestionnaire de session. Les applications participant à la session sont appelées clients de session.

Le gestionnaire de session émet des commandes à ses clients au nom de l'utilisateur. Ces commandes peuvent amener les clients à effectuer des modifications non enregistrées (par exemple en enregistrant les fichiers ouverts), à préserver leur état pour les sessions futures ou à se terminer de manière gracieuse. L'ensemble de ces opérations est appelé gestion de session.

Dans le cas courant, une session est constituée de toutes les applications qu'un utilisateur exécute sur son bureau à un moment donné. Sous Unix/Linux, cependant, une session peut inclure des applications s'exécutant sur différents ordinateurs et peut couvrir plusieurs écrans.

Fermeture d'une session

Une session est fermée par le gestionnaire de session, généralement au nom de l'utilisateur lorsqu'il souhaite se déconnecter. Un système peut également procéder à un arrêt automatique dans une situation d'urgence, par exemple en cas de coupure de courant imminente. Il est clair qu'il existe une différence importante entre ces deux types d'arrêt. Dans le premier cas, l'utilisateur peut vouloir interagir avec l'application, en spécifiant exactement quels fichiers doivent être sauvegardés et lesquels doivent être supprimés. Dans le second cas, il n'y a pas de temps pour l'interaction. Il se peut même qu'il n'y ait pas d'utilisateur assis devant la machine !

Protocoles et prise en charge sur différentes plateformes

Sur macOS et les versions de Microsoft Windows antérieures à Windows 2000, il n'existe pas encore de gestion complète des sessions pour les applications, c'est-à-dire qu'il n'y a pas de restauration des sessions précédentes. (Windows 2000 et XP proposent une "hibernation" où la totalité de la mémoire est sauvegardée sur le disque et restaurée au redémarrage de la machine). Ils prennent en charge les déconnexions gracieuses où les applications ont la possibilité d'annuler le processus après avoir obtenu la confirmation de l'utilisateur. C'est la fonctionnalité qui correspond au signal QGuiApplication::commitDataRequest().

X11 prend en charge la gestion complète des sessions depuis X11R6.

Faire fonctionner la gestion de session avec Qt

Commencez par connecter un slot au signal QGuiApplication::commitDataRequest() pour permettre à votre application de prendre part au processus de déconnexion gracieuse. Si vous ne visez que la plateforme Microsoft Windows, c'est tout ce que vous pouvez et devez fournir. Idéalement, votre application devrait fournir une boîte de dialogue d'arrêt similaire à la suivante :

Un dialogue typique sur l'arrêt

Un exemple de code pour cette boîte de dialogue se trouve dans la documentation de QSessionManager::allowsInteraction().

Pour une gestion complète de la session (uniquement supportée par X11R6 à l'heure actuelle), vous devez également prendre soin de sauvegarder l'état de l'application, et éventuellement de restaurer l'état lors du prochain cycle de vie de la session. Cette sauvegarde est effectuée en implémentant un slot connecté au signal QGuiApplication::saveStateRequest(). Toutes les données d'état que vous sauvegardez dans cette fonction doivent être marquées avec l'identifiant de session QGuiApplication::sessionId(). Cet identifiant spécifique à l'application est unique au niveau mondial, de sorte qu'il n'y a pas de conflit. (Voir QSessionManager pour des informations sur la sauvegarde/restauration de l'état d'une application Qt particulière).

La restauration est généralement effectuée dans la fonction main() de l'application. Vérifiez que QGuiApplication::isSessionRestored() est bien true. Si c'est le cas, utilisez à nouveau l'identificateur de session QGuiApplication::sessionId() pour accéder à vos données d'état et restaurer l'état de l'application.

Important : pour permettre au gestionnaire de fenêtres de restaurer les attributs de la fenêtre tels que l'ordre d'empilement ou les informations géométriques, vous devez identifier vos widgets de premier niveau avec des noms d'objets uniques à l'échelle de l'application (voir QObject::setObjectName()). Lors de la restauration de l'application, vous devez vous assurer que tous les widgets de premier niveau restaurés reçoivent les mêmes noms uniques qu'auparavant.

Test et débogage de la gestion de session

La prise en charge de la gestion de session sous macOS et Windows est relativement limitée en raison de l'absence de cette fonctionnalité dans le système d'exploitation lui-même. Fermez simplement la session et vérifiez que votre application se comporte comme prévu. Il peut être utile de lancer une autre application, généralement l'environnement de développement intégré, avant de démarrer votre application. Cette autre application recevra ensuite le message d'arrêt, ce qui vous permettra d'annuler l'arrêt. Sinon, vous devriez vous reconnecter après chaque test, ce qui n'est pas un problème en soi, mais prend du temps.

Sous Unix, vous pouvez soit utiliser un environnement de bureau qui prend en charge la gestion de session standard X11R6, soit, et c'est la méthode recommandée, utiliser l'implémentation de référence du gestionnaire de session fournie par le consortium X. Ce gestionnaire de référence s'appelle . Cet exemple de gestionnaire s'appelle xsm et fait partie de l'installation standard de X11R6. Comme toujours avec X11, une page de manuel utile et informative est fournie. L'utilisation de xsm est simple (à part l'interface utilisateur maladroite basée sur Athena). Voici une approche simple :

  • Lancez X11R6.
  • Créez un fichier point .xsmstartup dans votre répertoire personnel, qui contient la ligne suivante
    xterm

    Cela indique à xsm que la session par défaut/failsafe est juste un xterm et rien d'autre. Sinon, xsm essaierait d'invoquer de nombreux clients, y compris le gestionnaire de fenêtres twm, ce qui n'est pas très utile.

  • Lancez maintenant xsm à partir d'une autre fenêtre de terminal. Une fenêtre du gestionnaire de session et le xterm apparaissent. Le xterm possède une propriété intéressante qui le distingue de tous les autres shells que vous exécutez actuellement : dans son shell, la variable d'environnement SESSION_MANAGER pointe vers le gestionnaire de session que vous venez de lancer.
  • Lancez votre application à partir de la nouvelle fenêtre xterm. Elle se connectera automatiquement au gestionnaire de session. Vous pouvez vérifier à l'aide du bouton poussoir de la liste des clients si la connexion a réussi.

    Remarque : ne laissez jamais la liste des clients ouverte lorsque vous démarrez ou terminez des clients gérés par session ! Sinon, xsm risque de se bloquer.

  • Utilisez les boutons Checkpoint et Shutdown du gestionnaire de session avec différents paramètres et voyez comment se comporte votre application. Le type de sauvegarde local signifie que les clients doivent sauvegarder leur état. Il correspond au signal QGuiApplication::saveStateRequest(). Le type de sauvegarde globale demande aux applications d'enregistrer leurs modifications non sauvegardées dans un espace de stockage permanent, accessible à l'échelle mondiale. Il invoque QGuiApplication::commitDataRequest().
  • Lorsque quelque chose plante, il faut blâmer xsm et non Qt XML. xsm est loin d'être un gestionnaire de session utilisable sur le bureau d'un utilisateur. Il est cependant suffisamment stable et utile pour servir d'environnement de test.

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