会话管理

会话是一组正在运行的应用程序,每个应用程序都有特定的状态。会话由称为会话 管理器的服务控制。参与会话的应用程序称为会话客户端

会话管理器代表用户向客户端发出命令。这些命令可能会导致客户端提交未保存的更改(例如保存打开的文件)、为未来会话保存状态或优雅地终止会话。这些操作的集合称为会话 管理

在普通情况下,会话由用户在同一时间在桌面上运行的所有应用程序组成。不过,在 Unix/X11 下,会话可能包括在不同计算机上运行的应用程序,也可能跨越多个显示屏。

关闭会话

会话由会话管理器关闭,通常是在用户要注销时代表用户关闭。在紧急情况下,例如即将断电时,系统也可能自动关闭会话。显然,这几种关机方式有很大区别。在前一种情况下,用户可能希望与应用程序进行交互,明确指定哪些文件应该保存,哪些应该丢弃。在后一种情况下,没有时间进行交互。甚至可能没有用户坐在机器前!

不同平台上的协议和支持

在 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 协会提供的会话管理器参考实现。该示例管理器名为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 xsm 远非用户桌面上可用的会话管理器。不过,它足够稳定和有用,可以用作测试环境。

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