En esta página

Gestión de sesiones

Una sesión es un grupo de aplicaciones en ejecución, cada una de las cuales tiene un estado particular. La sesión está controlada por un servicio denominado gestor de sesiones. Las aplicaciones que participan en la sesión se denominan clientes de sesión.

El gestor de sesión emite órdenes a sus clientes en nombre del usuario. Estas órdenes pueden hacer que los clientes confirmen los cambios no guardados (por ejemplo, guardando los archivos abiertos), conserven su estado para futuras sesiones o finalicen la sesión de forma automática. El conjunto de estas operaciones se denomina gestión de sesiones.

En el caso común, una sesión consiste en todas las aplicaciones que un usuario ejecuta en su escritorio a la vez. En Unix/Linux, sin embargo, una sesión puede incluir aplicaciones que se ejecutan en diferentes ordenadores y puede abarcar múltiples pantallas.

Cómo cerrar una sesión

Una sesión es cerrada por el gestor de sesiones, normalmente en nombre del usuario cuando éste quiere cerrar la sesión. Un sistema también puede realizar un apagado automático en una situación de emergencia, por ejemplo, si está a punto de perderse el suministro eléctrico. Está claro que hay una diferencia significativa entre estos tipos de apagado. Durante el primero, el usuario puede querer interactuar con la aplicación, especificando exactamente qué archivos deben guardarse y cuáles deben descartarse. En el segundo caso, no hay tiempo para la interacción. Puede que ni siquiera haya un usuario sentado frente a la máquina.

Protocolos y soporte en diferentes plataformas

En macOS, y en las versiones de Microsoft Windows anteriores a Windows 2000, aún no existe nada parecido a una gestión completa de sesiones para aplicaciones, es decir, no hay restauración de sesiones anteriores. (Windows 2000 y XP proporcionan "hibernación", en la que toda la memoria se guarda en el disco y se restaura cuando se reinicia la máquina). Sí admiten el cierre de sesión graceful, en el que las aplicaciones tienen la oportunidad de cancelar el proceso tras obtener la confirmación del usuario. Esta es la funcionalidad que corresponde a la señal QGuiApplication::commitDataRequest().

X11 ha soportado la gestión completa de sesiones desde X11R6.

Cómo hacer funcionar la gestión de sesiones con Qt

Empieza por conectar una ranura a la señal QGuiApplication::commitDataRequest() para permitir a tu aplicación tomar parte en el proceso de cierre de sesión graceful. Si sólo te diriges a la plataforma Microsoft Windows, esto es todo lo que puedes y debes proporcionar. Idealmente, tu aplicación debería proporcionar un diálogo de apagado similar al siguiente:

Un diálogo típico al apagar

Puede encontrar código de ejemplo para este diálogo en la documentación de QSessionManager::allowsInteraction().

Para una gestión completa de la sesión (sólo soportada en X11R6 por el momento), también debes encargarte de guardar el estado de la aplicación, y potencialmente de restaurar el estado en el siguiente ciclo de vida de la sesión. Este guardado se realiza implementando una ranura conectada a la señal QGuiApplication::saveStateRequest(). Todos los datos de estado que estés guardando en esta función, deben ser marcados con el identificador de sesión QGuiApplication::sessionId(). Este identificador específico de la aplicación es globalmente único, por lo que no se producirán conflictos. (Ver QSessionManager para información sobre guardar/restaurar el estado de una aplicación Qt en particular).

La restauración se realiza normalmente en la función main() de la aplicación. Comprueba si QGuiApplication::isSessionRestored() es true. Si ese es el caso, utiliza de nuevo el identificador de sesión QGuiApplication::sessionId() para acceder a tus datos de estado y restaurar el estado de la aplicación.

Importante: Para que el gestor de ventanas pueda restaurar los atributos de la ventana, como el orden de apilamiento o la información de geometría, debes identificar tus widgets de nivel superior con nombres de objeto únicos para toda la aplicación (consulta QObject::setObjectName()). Al restaurar la aplicación, debes asegurarte de que todos los widgets de nivel superior restaurados reciben los mismos nombres únicos que tenían antes.

Prueba y depuración de la gestión de sesiones

El soporte de gestión de sesiones en macOS y Windows es bastante limitado debido a la falta de esta funcionalidad en el propio sistema operativo. Simplemente cierra la sesión y comprueba que tu aplicación se comporta como esperas. Puede ser útil lanzar otra aplicación, normalmente el entorno de desarrollo integrado, antes de iniciar tu aplicación. Esta otra aplicación recibirá después el mensaje de apagado, lo que le permitirá cancelar el apagado. De lo contrario, tendrías que volver a iniciar sesión después de cada prueba, lo que no es un problema en sí, pero consume tiempo.

En Unix puedes utilizar un entorno de escritorio que soporte la gestión de sesiones estándar X11R6 o, el método recomendado, utilizar la implementación de referencia del gestor de sesiones proporcionada por el X Consortium. Este gestor de ejemplo se llama xsm y forma parte de una instalación estándar de X11R6. Como siempre con X11, se proporciona una página de manual útil e informativa. Usar xsm es sencillo (aparte de la torpe interfaz de usuario basada en Athena). He aquí un enfoque sencillo:

  • Ejecuta X11R6.
  • Crea un archivo de puntos .xsmstartup en tu directorio personal que contenga la siguiente línea
    xterm

    Esto le dice a xsm que la sesión por defecto/failafe es sólo un xterm y nada más. De lo contrario, xsm intentaría invocar a muchos clientes, incluido el gestor de ventanas twm, lo que no es muy útil.

  • Ahora lanza xsm desde otra ventana de terminal. Aparecerán tanto la ventana del gestor de sesiones como el xterm. El xterm tiene una buena propiedad que lo diferencia de todos los demás shells que estés ejecutando: dentro de su shell, la variable de entorno SESSION_MANAGER apunta al gestor de sesiones que acabas de iniciar.
  • Inicia tu aplicación desde la nueva ventana xterm. Se conectará automáticamente al gestor de sesiones. Puede comprobar con el botón ClientList si la conexión se ha realizado correctamente.

    Nota: ¡Nunca mantenga la Lista de Clientes abierta cuando inicie o finalice una sesión de cliente! De lo contrario, es probable que xsm se bloquee.

  • Utilice los botones Checkpoint y Shutdown del gestor de sesiones con diferentes configuraciones y compruebe cómo se comporta su aplicación. El tipo de guardado local significa que los clientes deben guardar su estado. Corresponde a la señal QGuiApplication::saveStateRequest(). El tipo de guardado global pide a las aplicaciones que guarden sus cambios no guardados en un almacenamiento permanente y accesible globalmente. Invoca a QGuiApplication::commitDataRequest().
  • Siempre que algo se cuelgue, échale la culpa a xsm y no a Qt. xsm está lejos de ser un gestor de sesiones utilizable en el escritorio de un usuario. Sin embargo, es lo suficientemente estable y útil para servir como entorno de pruebas.

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