QSessionManager 类

QSessionManager 类提供对会话管理器的访问。 更多信息...

头文件 #include <QSessionManager>
CMakefind_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmakeQT += gui
继承 QObject

公共类型

枚举RestartHint { RestartIfRunning, RestartAnyway, RestartImmediately, RestartNever }

公共函数

boolallowsErrorInteraction()
boolallowsInteraction()
voidcancel()
QStringListdiscardCommand() const
boolisPhase2() const
voidrelease()
voidrequestPhase2()
QStringListrestartCommand() const
QSessionManager::RestartHintrestartHint() const
QStringsessionId() const
QStringsessionKey() const
voidsetDiscardCommand(const QStringList &command)
voidsetManagerProperty(const QString &name, const QStringList &value)
voidsetManagerProperty(const QString &name, const QString &value)
voidsetRestartCommand(const QStringList &command)
voidsetRestartHint(QSessionManager::RestartHint hint)

详细介绍

桌面环境中(其中 Qt GUI 应用程序运行)的会话管理器跟踪一个会话,会话是一组运行着的应用程序,每个应用程序都有自己的特定状态。应用程序的状态包含(最显著的是)应用程序打开的文档以及其窗口的位置和大小。

会话管理器用于保存会话,例如,当机器关闭时,以及恢复会话,例如,当机器启动时。我们建议您使用 QSettings 来保存应用程序设置,例如,窗口位置,近期使用的文件等。当会话管理器重新启动应用程序时,您可以恢复设置。

QSessionManager 提供了应用程序与平台会话管理器之间的接口。在 Qt 中,会话管理请求由两个信号 QGuiApplication::commitDataRequestQGuiApplication::saveStateRequest() 处理。这两个信号都提供了对 QSessionManager 对象的引用作为参数。会话管理器只能在这些信号引发的槽中访问。

除非应用程序从会话管理器那里得到明确授权,否则无法进行用户交互。您可以通过调用allowsInteraction()来请求授权,或者在非常紧急的情况下,调用allowsErrorInteraction()。Qt不强制执行此操作,但会话管理器可能会这样做。

您可以通过调用cancel()来尝试中止关闭过程。

对于Unix/X11上提供的复杂会话管理器,QSessionManager提供了进一步调整应用程序会话管理行为的方法:setRestartCommand()、setDiscardCommand()、setRestartHint()、setProperty()、requestPhase2()。请参考各自的函数描述以获取更多详细信息。

另请参阅QGuiApplication会话管理

成员类型文档

枚举QSessionManager::RestartHint

此枚举类型定义了会话管理器重启此应用程序的情境。当前值包括

常数描述
QSessionManager::RestartIfRunning0如果会话关闭时应用程序仍在运行,它希望在下一个会话的开始时重启。
QSessionManager::RestartAnyway1无论什么情况,应用程序都希望在下一个会话的开始时启动。这对于启动后即退出的小工具很有用。
QSessionManager::RestartImmediately2每当应用程序未运行时,都希望立即启动。
QSessionManager::RestartNever3应用程序不希望自动重启。

默认提示为RestartIfRunning。

成员函数文档

bool QSessionManager::allowsErrorInteraction()

如果允许错误交互,返回true;否则返回false

这与allowsInteraction()相似,但同时也允许应用程序向用户报告发生的任何错误。会话管理器可能赋予错误交互请求更高的优先级,这意味着错误交互更有可能被允许。但是,您仍然不能保证会话管理器会允许交互。

另请参阅allowsInteraction()、release()和cancel

bool QSessionManager::allowsInteraction()

向会话管理器请求与用户交互的权限。如果允许交互,则返回true;否则返回false

此机制的原理是在关闭过程中同步用户交互。高级会话管理器可能会同时要求所有应用程序提交它们的文件,从而使关闭更快。

在交互完成后,我们强烈建议通过调用release()来释放用户交互信号量。这样,其他应用程序在您的应用程序仍在保存数据的情况下都有机会与用户交互。(当应用程序退出时,信号量会隐式释放。)

如果用户决定在交互阶段取消关闭过程,您必须通过调用cancel()来告知会话管理器此事件已发生。

以下是如何实现应用程序的QGuiApplication::commitDataRequest()的示例:

MyMainWidget::MyMainWidget(QWidget *parent)
    : QWidget(parent)
{
    connect(qApp, &QGuiApplication::commitDataRequest,
            this, &MyMainWidget::commitData);
}

void MyMainWidget::commitData(QSessionManager& manager)
{
    if (manager.allowsInteraction()) {
        int ret = QMessageBox::warning(
                    mainWindow,
                    tr("My Application"),
                    tr("Save changes to document?"),
                    QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);

        switch (ret) {
        case QMessageBox::Save:
            manager.release();
            if (!saveDocument())
                manager.cancel();
            break;
        case QMessageBox::Discard:
            break;
        case QMessageBox::Cancel:
        default:
            manager.cancel();
        }
    } else {
        // we did not get permission to interact, then
        // do something reasonable instead
    }
}

如果在保存应用程序数据时发生错误,您可能想尝试使用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()标记数据,您将能够在未来的会话中恢复应用程序。

另请参阅 restartCommandsetDiscardCommandsetRestartHint

void QSessionManager::setRestartHint(QSessionManager::RestartHint hint)

将应用程序的重启提示设置为hint。在应用程序启动时,提示设置为RestartIfRunning

注意:这些标志仅作为提示,会话管理器可能会或可能不会遵守它们。

我们建议在QGuiApplication::saveStateRequest()中设置重启提示,因为大多数会话管理器在应用程序启动后不久就会执行检查点。

另请参阅 restartHint

© 2024 Qt公司有限公司。本文档中包含的文档贡献归其各自的拥有者所有。本提供的文档根据自由软件基金会发布的GNU自由文档许可(版本1.3)的条款颁发。Qt及其相关标志是芬兰以及/或其他国家的Qt公司有限公司的商标。所有其他商标均属于其各自的所有者。