QStateMachine Class
QStateMachine 类提供了一个分层有限状态机。更多内容...
| 头文件: | #include <QStateMachine> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS StateMachine) target_link_libraries(mytarget PRIVATE Qt6::StateMachine) |
| qmake: | QT += statemachine |
| 继承自: | QState |
注意:本类中的所有函数均为可重入的。
注意:以下函数也具有线程安全性:
- postEvent(QEvent *event, QStateMachine::EventPriority priority)
- postDelayedEvent(QEvent *event, int delay)
- cancelDelayedEvent(int id)
- postDelayedEvent(QEvent *event, std::chrono::milliseconds delay)
公共类型
| class | SignalEvent |
| class | WrappedEvent |
| enum | Error { NoError, NoInitialStateError, NoDefaultStateInHistoryStateError, NoCommonAncestorForTransitionError, StateMachineChildModeSetToParallelError } |
| enum | EventPriority { NormalPriority, HighPriority } |
属性
- animated : bool
- errorString : QString
- globalRestorePolicy : QState::RestorePolicy
- running : bool
公共函数
| QStateMachine(QObject *parent = nullptr) | |
| virtual | ~QStateMachine() |
| void | addDefaultAnimation(QAbstractAnimation *animation) |
| void | addState(QAbstractState *state) |
| QBindable<bool> | bindableAnimated() |
| QBindable<QString> | bindableErrorString() const |
| QBindable<QState::RestorePolicy> | bindableGlobalRestorePolicy() |
| bool | cancelDelayedEvent(int id) |
| void | clearError() |
| QSet<QAbstractState *> | configuration() const |
| QList<QAbstractAnimation *> | defaultAnimations() const |
| QStateMachine::Error | error() const |
| QString | errorString() const |
| QState::RestorePolicy | globalRestorePolicy() const |
| bool | isAnimated() const |
| bool | isRunning() const |
| int | postDelayedEvent(QEvent *event, int delay) |
| int | postDelayedEvent(QEvent *event, std::chrono::milliseconds delay) |
| void | postEvent(QEvent *event, QStateMachine::EventPriority priority = NormalPriority) |
| void | removeDefaultAnimation(QAbstractAnimation *animation) |
| void | removeState(QAbstractState *state) |
| void | setAnimated(bool enabled) |
| void | setGlobalRestorePolicy(QState::RestorePolicy restorePolicy) |
重新实现的公共函数
| virtual bool | eventFilter(QObject *watched, QEvent *event) override |
公共插槽
| void | setRunning(bool running) |
| void | start() |
| void | stop() |
信号
| void | runningChanged(bool running) |
| void | started() |
| void | stopped() |
重新实现的受保护函数
| virtual bool | event(QEvent *e) override |
| virtual void | onEntry(QEvent *event) override |
| virtual void | onExit(QEvent *event) override |
详细说明
QStateMachine 基于状态图(Statecharts)的概念和符号体系。QStateMachine 是Qt State Machine 框架的一部分。
状态机管理一组状态(继承自QAbstractState 的类)以及这些状态之间的转换(QAbstractTransition 的子类);这些状态和转换共同定义了一个状态图。一旦状态图构建完成,状态机即可执行它。 QStateMachine 的执行算法基于状态图 XML(SCXML)算法。该框架的概述提供了若干状态图及其构建代码。
使用addState() 函数向状态机添加顶级状态。使用removeState() 函数移除状态。不建议在状态机运行时移除状态。
在启动状态机之前,必须设置initial state 。初始状态是指状态机启动时进入的状态。随后,您可以调用start()来启动状态机。当进入初始状态时,会触发started()信号。
该状态机是事件驱动的,并维护着自己的事件循环。事件通过 `postEvent()` 发布到状态机。请注意,这意味着状态机以异步方式执行,且在没有运行中的事件循环时不会继续执行。 通常情况下,您无需直接向状态机发布事件,因为 Qt 的转换类(例如QEventTransition 及其子类)会自动处理此事。但对于由事件触发的自定义转换,postEvent() 非常有用。
状态机处理事件并执行状态转换,直至进入顶级最终状态;此时状态机将发出finished() 信号。您也可以显式地调用stop() 结束状态机。此时将发出stopped() 信号。
以下代码片段展示了一个在点击按钮时结束运行的状态机:
QPushButton button;
QStateMachine machine;
QState *s1 = new QState();
s1->assignProperty(&button, "text", "Click me");
QFinalState *s2 = new QFinalState();
s1->addTransition(&button, &QPushButton::clicked, s2);
machine.addState(s1);
machine.addState(s2);
machine.setInitialState(s1);
machine.start();此代码示例使用了QState ,该类继承自QAbstractState 。QState 类提供了一种状态,您可以在进入或退出该状态时,对QObject进行属性设置和方法调用。它还包含用于添加过渡的便捷函数,例如本示例中的QSignalTransition。更多详细信息请参阅QState 类的描述。
如果遇到错误,系统将查找error state ,如果存在该状态,则进入该状态。 可能出现的错误类型由Error 枚举描述。进入错误状态后,可通过error()获取错误类型。进入错误状态时,状态图的执行不会停止。如果错误状态不适用任何错误状态,则机器将停止执行,并向控制台打印一条错误消息。
注意:重要提示 :将状态机的ChildMode 属性设置为parallel(ParallelStates )会导致状态机无效。该属性只能设置为(或保持为)ExclusiveStates 。
另请参阅 QAbstractState 、QAbstractTransition 、QState 以及Qt State Machine 概述。
成员类型文档
enum QStateMachine::Error
此枚举类型定义了状态机在运行时可能发生的错误。当状态机在运行时遇到不可恢复的错误时,它将设置error()返回的错误代码、errorString()返回的错误消息,并根据错误上下文进入相应的错误状态。
| 常量 | 值 | 描述 |
|---|---|---|
QStateMachine::NoError | 0 | 未发生错误。 |
QStateMachine::NoInitialStateError | 1 | 状态机进入了一个带有子节点的QState ,但该状态机未设置初始状态。此错误的上下文是缺少初始状态的状态。 |
QStateMachine::NoDefaultStateInHistoryStateError | 2 | 该状态机已进入一个未设置默认状态的QHistoryState 。此错误的上下文是缺少默认状态的QHistoryState 。 |
QStateMachine::NoCommonAncestorForTransitionError | 3 | 该状态机选择了一条源状态和目标状态不属于同一状态树、因此也不属于同一状态机的转换。通常,这可能意味着其中一个状态未被指定父状态,或未被添加到任何状态机中。此错误的上下文是该转换的源状态。 |
QStateMachine::StateMachineChildModeSetToParallelError | 4 | 状态机的childMode 属性被设置为QState::ParallelStates 。这是不合法的。只有状态可以被声明为并行,状态机本身不能。该枚举值是在 Qt 5.14 中添加的。 |
另请参阅 setErrorState()。
enum QStateMachine::EventPriority
此枚举类型用于指定使用postEvent()向状态机发布事件时的优先级。
高优先级的事件会在普通优先级的事件之前被处理。
| 常量 | 值 | 描述 |
|---|---|---|
QStateMachine::NormalPriority | 0 | 该事件具有普通优先级。 |
QStateMachine::HighPriority | 1 | 该事件具有高优先级。 |
属性文档
[bindable] animated : bool
注意:此 属性支持QProperty 绑定。
该属性用于指定是否启用动画
该属性的默认值为true 。
另请参阅 QAbstractTransition::addAnimation()
访问函数:
| bool | isAnimated() const |
| void | setAnimated(bool enabled) |
[bindable read-only] errorString : QString
注意:此 属性支持QProperty 绑定。
该属性存储此状态机的错误字符串
访问函数:
| QString | errorString() const |
[bindable] globalRestorePolicy : QState::RestorePolicy
注意:该 属性支持QProperty 绑定。
该属性保存了此状态机的状态恢复策略。
该属性的默认值为QState::DontRestoreProperties 。
访问函数:
| QState::RestorePolicy | globalRestorePolicy() const |
| void | setGlobalRestorePolicy(QState::RestorePolicy restorePolicy) |
running : bool
该属性存储了该状态机的运行状态
访问函数:
| bool | isRunning() const |
| void | setRunning(bool running) |
通知器信号:
| void | runningChanged(bool running) |
另请参阅 start()、stop()、started()、stopped()和runningChanged()。
成员函数文档
[explicit] QStateMachine::QStateMachine(QObject *parent = nullptr)
根据给定的parent 构建一个新的状态机。
[virtual noexcept] QStateMachine::~QStateMachine()
销毁此状态机。
void QStateMachine::addDefaultAnimation(QAbstractAnimation *animation)
添加一个默认的animation ,供任何过渡操作参考。
void QStateMachine::addState(QAbstractState *state)
将给定的state 添加到该状态机中。该状态将成为顶级状态,且状态机将拥有该状态的所有权。
如果该状态已属于其他状态机,则会先将其从原状态机中移除,然后添加到本状态机中。
另请参阅 removeState() 和setInitialState()。
bool QStateMachine::cancelDelayedEvent(int id)
取消由给定的id 标识的延迟事件。该id应为调用postDelayedEvent()所返回的值。如果事件成功取消,则返回true ;否则返回false 。
注意:此函数是线程安全的。
另请参阅 postDelayedEvent()。
void QStateMachine::clearError()
清除状态机的错误字符串和错误代码。
QSet<QAbstractState *> QStateMachine::configuration() const
返回该状态机当前所处的最大一致状态集(包括并行状态和终态)。如果配置中包含某个状态s ,那么s 的父状态也必然包含在c中。但请注意,状态机本身并非该配置的显式成员。
QList<QAbstractAnimation *> QStateMachine::defaultAnimations() const
返回将在任何过渡效果中被考虑的默认动画列表。
QStateMachine::Error QStateMachine::error() const
返回状态机中发生的最后一次错误的错误代码。
QString QStateMachine::errorString() const
返回状态机中发生的最后一次错误的错误字符串。
注意: 这是 errorString 属性的获取器 函数。
[override virtual protected] bool QStateMachine::event(QEvent *e)
重写了:QState::event(QEvent *e)。
[override virtual] bool QStateMachine::eventFilter(QObject *watched, QEvent *event)
重写了:QObject::eventFilter(QObject *watched, QEvent *event)。
QState::RestorePolicy QStateMachine::globalRestorePolicy() const
返回状态机的恢复策略。
注意: 这是 globalRestorePolicy 属性的获取 函数。
另请参阅 setGlobalRestorePolicy()。
bool QStateMachine::isAnimated() const
返回此状态机是否启用了动画。
注意: 这是属性 `animated` 的获取器 函数。
[override virtual protected] void QStateMachine::onEntry(QEvent *event)
重写自:QState::onEntry(QEvent *event)。
该函数将调用start() 来启动状态机。
[override virtual protected] void QStateMachine::onExit(QEvent *event)
重写:QState::onExit(QEvent *event)。
该函数将调用stop()来停止状态机,随后发出stopped()信号。
int QStateMachine::postDelayedEvent(QEvent *event, int delay)
将给定的event 事件提交给该状态机进行处理,延迟时间为给定的delay (单位为毫秒)。返回与该延迟事件关联的标识符;如果无法提交该事件,则返回-1。
此函数立即返回。当延迟时间结束时,该事件将被添加到状态机的事件队列中以供处理。状态机将获取该事件的所有权,并在处理完成后将其删除。
仅当状态机正在运行时,才能发布事件。
注意:此函数是线程安全的。
另请参阅 cancelDelayedEvent() 和postEvent()。
int QStateMachine::postDelayedEvent(QEvent *event, std::chrono::milliseconds delay)
将给定的event 事件提交给该状态机进行处理,延迟时间为delay (单位:毫秒)。返回与该延迟事件关联的标识符;若无法提交该事件,则返回-1。
此函数立即返回。当延迟时间结束时,该事件将被添加到状态机的事件队列中以供处理。状态机将接管该事件,并在处理完成后将其删除。
仅当状态机正在运行时,才能发布事件。
这是一个重载函数。
注意:此函数是线程安全的。
另请参阅 cancelDelayedEvent() 和postEvent()。
void QStateMachine::postEvent(QEvent *event, QStateMachine::EventPriority priority = NormalPriority)
将给定priority 的event 事件提交给该状态机进行处理。
此函数立即返回。事件将被添加到状态机的事件队列中。事件按发布顺序进行处理。状态机将接管该事件,并在处理完成后将其删除。
仅当状态机正在运行或正在启动时,才可发布事件。
注意:此函数是线程安全的。
另请参阅 postDelayedEvent()。
void QStateMachine::removeDefaultAnimation(QAbstractAnimation *animation)
将“animation ”从默认动画列表中移除。
void QStateMachine::removeState(QAbstractState *state)
从该状态机中移除指定的state 。状态机将释放对该状态的所有权。
另请参阅 addState()。
[signal] void QStateMachine::runningChanged(bool running)
当通过将running 作为参数来更改running属性时,会触发此信号。
注意: 这是属性 `running`的通知器 信号。
另请参阅 QStateMachine::running 。
void QStateMachine::setAnimated(bool enabled)
用于设置此状态机中的动画是否为enabled 。
注意: 这是属性animated 的设置 函数。
另请参阅 isAnimated()。
void QStateMachine::setGlobalRestorePolicy(QState::RestorePolicy restorePolicy)
将状态机的恢复策略设置为restorePolicy 。默认恢复策略为QState::DontRestoreProperties 。
注意: 这是属性globalRestorePolicy 的设置 函数。
另请参阅 globalRestorePolicy()。
[slot] void QStateMachine::start()
启动此状态机。状态机将重置其配置并转入初始状态。当进入最终的顶级状态(QFinalState )时,状态机将发出finished()信号。
注意: 如果没有正在运行的事件循环(例如通过QCoreApplication::exec() 或QApplication::exec() 启动的主应用程序事件循环),状态机 将无法运行。
另请参阅 started()、finished()、stop()、initialState() 以及setRunning()。
[private signal] void QStateMachine::started()
当状态机进入初始状态(QStateMachine::initialState)时,会发出此信号。
注意:这是一个 私有信号。它可以在信号连接中使用,但用户无法触发它。
另请参阅 QStateMachine::finished() 和QStateMachine::start()。
[slot] void QStateMachine::stop()
停止此状态机。状态机将停止处理事件,然后发出stopped()信号。
另请参阅 stopped()、start() 和setRunning()。
[private signal] void QStateMachine::stopped()
当状态机停止运行时,会发出此信号。
注意:这是一个 私有信号。它可以在信号连接中使用,但用户无法触发它。
另请参阅 QStateMachine::stop() 和QStateMachine::finished()。
© 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.