QSessionManager Class
QSessionManager 类提供对会话管理器的访问。更多
Header: | #include <QSessionManager> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
继承: | QObject |
公共类型
enum | RestartHint { RestartIfRunning, RestartAnyway, RestartImmediately, RestartNever } |
公共函数
bool | allowsErrorInteraction() |
bool | allowsInteraction() |
void | cancel() |
QStringList | discardCommand() const |
bool | isPhase2() const |
void | release() |
void | requestPhase2() |
QStringList | restartCommand() const |
QSessionManager::RestartHint | restartHint() const |
QString | sessionId() const |
QString | sessionKey() const |
void | setDiscardCommand(const QStringList &command) |
void | setManagerProperty(const QString &name, const QStringList &value) |
void | setManagerProperty(const QString &name, const QString &value) |
void | setRestartCommand(const QStringList &command) |
void | setRestartHint(QSessionManager::RestartHint hint) |
详细说明
桌面环境中的会话管理器(Qt GUI 应用程序在其中运行)负责跟踪会话,会话是一组正在运行的应用程序,每个应用程序都有特定的状态。应用程序的状态包含(最主要的)应用程序打开的文档及其窗口的位置和大小。
会话管理器用于保存会话(例如在关机时)和恢复会话(例如在开机时)。我们建议使用QSettings 保存应用程序的设置,例如窗口位置、最近使用的文件等。当会话管理器重新启动应用程序时,就可以恢复这些设置。
QSessionManager 提供了应用程序与平台会话管理器之间的接口。在 Qt XML 中,会话管理的操作请求由两个信号QGuiApplication::commitDataRequest() 和QGuiApplication::saveStateRequest() 处理。这两个信号都提供一个 QSessionManager 对象的引用作为参数。会话管理器只能在这些信号调用的槽中访问。
除非应用程序获得会话管理器的明确许可,否则无法与用户交互。您可以通过调用allowsInteraction() 或allowsErrorInteraction() 来请求许可,如果情况非常紧急的话。Qt 不会强制执行,但会话管理器可能会。
您可以尝试通过调用cancel() 来中止关闭进程。
对于 Unix/X11 上提供的复杂会话管理器,QSessionManager 提供了更多可能性来微调应用程序的会话管理行为:setRestartCommand(),setDiscardCommand(),setRestartHint(),setProperty(),requestPhase2().更多详情请参见相应的功能说明。
另请参阅 QGuiApplication 和会话管理。
成员类型文档
enum QSessionManager::RestartHint
该枚举类型定义了会话管理器希望重启此应用程序的情况。当前值为
常量 | 值 | 描述 |
---|---|---|
QSessionManager::RestartIfRunning | 0 | 如果应用程序在会话关闭时仍在运行,则希望在下一次会话开始时重新启动。 |
QSessionManager::RestartAnyway | 1 | 无论如何,应用程序都希望在下一个会话开始时启动。(这对启动后运行然后退出的实用程序很有用)。 |
QSessionManager::RestartImmediately | 2 | 应用程序希望在不运行时立即启动。 |
QSessionManager::RestartNever | 3 | 应用程序不希望自动重启。 |
默认提示是RestartIfRunning
。
成员函数文档
bool QSessionManager::allowsErrorInteraction()
如果允许错误交互,则返回true
;否则返回false
。
这与allowsInteraction() 类似,但也能让应用程序告诉用户发生的任何错误。会话管理器可能会给予错误交互请求更高的优先级,这意味着允许错误交互的可能性更大。但仍不能保证会话管理器会允许交互。
另请参阅 allowsInteraction()、release() 和cancel()。
bool QSessionManager::allowsInteraction()
请求会话管理器允许与用户交互。如果允许交互,则返回 true;否则返回false
。
这种机制的基本原理是在关机过程中同步用户交互。高级会话管理器可要求所有应用程序同时提交数据,从而大大加快关机速度。
交互完成后,我们强烈建议调用release() 释放用户交互信号。这样,当您的应用程序仍在忙于保存数据时,其他应用程序就有机会与用户交互。(当应用程序退出时,将隐式释放该信号寄存器)。
如果用户决定在交互阶段取消关闭进程,则必须通过调用cancel() 告诉会话管理器这已经发生。
下面是一个应用程序如何实现QGuiApplication::commitDataRequest() 的示例:
MyMainWidget::MyMainWidget(QWidget*parent) : QWidget父类{ connect(qApp, &QGuiApplication::commitDataRequest, this, &MyMainWidget::commitData); }voidMyMainWidget::commitData(QSessionManager&manager) {if(manager.allowsInteraction()) {intret=QMessageBox::warning( mainWindow,tr("My Application"),tr("Save changes to document?")、 QMessageBox: :保存 QMessageBox: :丢弃 QMessageBox::取消);switch(ret) {caseQMessageBox::Save: manager.release();if(!saveDocument()) manager.cancel();break;caseQMessageBox::Discard:break;caseQMessageBox取消: 默认情况下:manager.cancel(); } }else{// 我们没有获得交互权限,那么 // 做一些合理的事情代替} }
如果应用程序在保存数据时发生错误,您可以尝试allowsErrorInteraction() 代替。
另请参见 QGuiApplication::commitDataRequest()、release() 和cancel()。
void QSessionManager::cancel()
通知会话管理器取消关闭进程。应用程序不应在未询问用户的情况下调用此函数。
另请参阅 allowsInteraction() 和allowsErrorInteraction()。
QStringList QSessionManager::discardCommand() const
返回当前设置的丢弃命令。
另请参阅 setDiscardCommand()、restartCommand() 和setRestartCommand()。
bool QSessionManager::isPhase2() const
如果会话管理器当前正在执行第二个会话管理阶段,则返回true
;否则返回false
。
另请参阅 requestPhase2() 。
void QSessionManager::release()
在交互阶段结束后释放会话管理器的交互信号。
另请参阅 allowsInteraction() 和allowsErrorInteraction()。
void QSessionManager::requestPhase2()
请求应用程序进入第二个会话管理阶段。然后,应用程序可以立即从QGuiApplication::commitDataRequest() 或QApplication::saveStateRequest() 函数返回,一旦大多数或所有其他应用程序完成会话管理,就会再次调用这两个函数。
这两个阶段对 X11 窗口管理器等应用程序非常有用,因为它们需要存储其他应用程序窗口的信息,因此必须等待这些应用程序完成各自的会话管理任务。
注意: 如果其他应用程序请求第二个阶段,它可能会在您的应用程序的第二个阶段之前、同时或之后被调用。
另请参阅 isPhase2()。
QStringList QSessionManager::restartCommand() const
返回当前设置的重启命令。
另请参阅 setRestartCommand() 和restartHint()。
QSessionManager::RestartHint QSessionManager::restartHint() const
返回应用程序当前的重启提示。默认值为RestartIfRunning
。
另请参阅 setRestartHint() 。
QString QSessionManager::sessionId() const
返回当前会话的标识符。
如果应用程序是从以前的会话中恢复的,则该标识符与以前会话中的标识符相同。
另请参阅 sessionKey() 和QGuiApplication::sessionId()。
QString QSessionManager::sessionKey() const
返回当前会话中的会话密钥。
如果应用程序是从较早的会话中恢复的,则此密钥与前一个会话结束时的密钥相同。
每次调用 commitData() 或 saveState() 时,会话密钥都会发生变化。
另请参阅 sessionId() 和QGuiApplication::sessionKey()。
void QSessionManager::setDiscardCommand(const QStringList &command)
将丢弃命令设置为给定的command 。
另请参阅 discardCommand() 和setRestartCommand()。
void QSessionManager::setManagerProperty(const QString &name, const QStringList &value)
对应用程序标识和状态记录的低级写入访问保存在会话管理器中。
名为name 的属性的值被设置为字符串列表value 。
void QSessionManager::setManagerProperty(const QString &name, const QString &value)
这是一个重载函数。
对应用程序标识和状态记录的低级写入访问保存在会话管理器中。
名为name 的属性的值设置为字符串value 。
void QSessionManager::setRestartCommand(const QStringList &command)
如果会话管理器能够恢复会话,则会执行command 以恢复应用程序。该命令默认为
appname -session id
-session
选项是必须的,否则QGuiApplication 无法判断是否已还原或当前会话标识符是什么。详情请参见QGuiApplication::isSessionRestored() 和QGuiApplication::sessionId()。
如果应用程序非常简单,可以将整个应用程序状态存储在额外的命令行选项中。这通常不是个好主意,因为命令行通常只有几百字节。为此,请使用QSettings 、临时文件或数据库。通过使用唯一的sessionId() 标记数据,可以在未来会话中恢复应用程序。
另请参阅 restartCommand()、setDiscardCommand() 和setRestartHint()。
void QSessionManager::setRestartHint(QSessionManager::RestartHint hint)
将应用程序的重启提示设置为hint 。应用程序启动时,提示将设置为RestartIfRunning
。
注意: 这些标志只是提示,会话管理器可能尊重也可能不尊重。
我们建议在QGuiApplication::saveStateRequest() 中设置重启提示,因为大多数会话管理器都会在应用程序启动后不久执行检查点操作。
另请参见 restartHint() 。
© 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.