会话管理
会话是一组正在运行的应用程序,其中每个应用程序都有特定的状态。会话由一个称为“会话 管理器”的服务进行控制。参与该会话的应用程序被称为会话客户端。
会话管理器代表用户向其客户端发出命令。这些命令可能会导致客户端提交未保存的更改(例如保存打开的文件)、为未来的会话保留其状态,或者优雅地终止。这一系列操作称为会话 管理。
通常情况下,一个会话由用户在桌面同时运行的所有应用程序组成。但在 Unix/Linux 环境下,一个会话可能包含运行在不同计算机上的应用程序,并可能跨越多个显示器。
关闭会话
会话由会话管理器关闭,通常是在用户想要注销时代表用户执行。在紧急情况下,例如即将断电时,系统也可能执行自动关闭。 显然,这两种关闭方式存在显著差异。在前者中,用户可能希望与应用程序进行交互,精确指定哪些文件应被保存、哪些应被丢弃;而在后者中,则没有时间进行交互,甚至可能根本没有用户坐在机器前!
不同平台上的协议与支持
在 macOS 以及 Windows 2000 之前的 Microsoft Windows 版本中,尚不存在针对应用程序的完整会话管理功能,即无法恢复之前的会话。 (Windows 2000 和 XP 提供了“休眠”功能,该功能会将整个内存保存到磁盘,并在机器重启时恢复。)它们确实支持优雅注销,即应用程序在获得用户确认后有机会取消该进程。这一功能对应于QGuiApplication::commitDataRequest() 信号。
X11 自 X11R6 起便已支持完整的会话管理。
让会话管理与 Qt 协同工作
首先,将一个槽连接到QGuiApplication::commitDataRequest() 信号,以便您的应用程序能够参与优雅注销过程。如果您仅针对 Microsoft Windows 平台开发,这便是您所能且必须提供的全部内容。理想情况下,您的应用程序应提供一个类似于以下示例的关机对话框:

该对话框的示例代码可在QSessionManager::allowsInteraction()的文档中找到。
若要实现完整的会话管理(目前仅在 X11R6 上受支持),您还必须负责保存应用程序的状态,并在会话的下一次生命周期中恢复该状态。通过实现一个连接到QGuiApplication::saveStateRequest() 信号的槽来完成此保存操作。 在此函数中保存的所有状态数据,都应标记为会话标识符QGuiApplication::sessionId()。该应用程序特定标识符在全局范围内是唯一的,因此不会发生冲突。(有关保存/恢复特定 Qt 应用程序状态的信息,请参阅QSessionManager 。)
状态的恢复通常在应用程序的 main() 函数中进行。检查QGuiApplication::isSessionRestored() 是否为true 。如果是,请再次使用会话标识符QGuiApplication::sessionId() 访问状态数据并恢复应用程序的状态。
重要提示:为了使窗口管理器能够恢复窗口属性(如堆叠顺序或几何信息),必须使用全应用程序范围内唯一的对象名称来标识顶级控件(参见QObject::setObjectName())。在恢复应用程序时,必须确保所有恢复的顶级控件都使用与之前相同的唯一名称。
会话管理的测试与调试
由于操作系统本身缺乏此功能,macOS 和 Windows 上的会话管理支持相当有限。只需关闭会话并验证您的应用程序是否按预期运行即可。 在启动您的应用程序之前,先启动另一个应用程序(通常是集成开发环境)可能会很有帮助。该应用程序随后会收到关闭通知,从而允许您取消关闭操作。否则,您在每次测试运行后都必须重新登录,这本身虽然不是问题,但会非常耗时。
在 Unix 系统上,您可以使用支持标准 X11R6 会话管理的桌面环境,或者采用推荐的方法:使用 X Consortium 提供的会话管理器参考实现。该示例管理器名为xsm ,是标准 X11R6 安装的一部分。 与 X11 一贯的风格一样,系统提供了实用且内容丰富的手册页。使用xsm 非常简单(除了基于 Athena 的用户界面略显笨拙之外)。以下是一种简便的方法:
- 运行 X11R6。
- 在您的主目录中创建一个名为
.xsmstartup的点文件,其中仅包含以下一行内容:xterm这会告诉 `
xsm`,默认/安全会话仅包含一个 xterm,别无其他。否则,`xsm` 会尝试调用大量客户端,包括窗口管理器 `twm`,这其实没什么用。 - 现在从另一个终端窗口启动
xsm。此时会同时出现会话管理器窗口和 xterm 窗口。xterm 具有一项与您当前运行的所有其他 shell 截然不同的特性:在其 shell 环境中,SESSION_MANAGER环境变量指向您刚刚启动的会话管理器。 - 从新的 xterm 窗口启动您的应用程序。它将自动连接到会话管理器。您可以通过点击“ClientList”按钮来检查连接是否成功。
注意: 在启动或结束会话管理客户端时,切勿 保持ClientList窗口打开!否则
xsm可能会崩溃。 - 请使用会话管理器的“检查点”和“关机”按钮并尝试不同的设置,观察应用程序的行为。保存类型为“本地”时,表示客户端应保存其状态,这对应于QGuiApplication::saveStateRequest()信号;保存类型为“全局”时,则要求应用程序将其未保存的更改保存到永久的、全局可访问的存储中,这会调用QGuiApplication::commitDataRequest()。
- 一旦发生崩溃,请归咎于 `
xsm`,而非 Qt。`xsm` 远非用户桌面上可用的会话管理器。不过,它足够稳定且实用,可作为测试环境使用。
© 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.