QStateMachine Class

QStateMachine 类提供了一个分层有限状态机。更多

Header: #include <QStateMachine>
CMake: find_package(Qt6 REQUIRED COMPONENTS StateMachine)
target_link_libraries(mytarget PRIVATE Qt6::StateMachine)
qmake: QT += statemachine
继承: QState

注:该类中的所有函数都是可重入的

注:这些函数也是线程安全的

公共类型

class SignalEvent
class WrappedEvent
enum Error { NoError, NoInitialStateError, NoDefaultStateInHistoryStateError, NoCommonAncestorForTransitionError, StateMachineChildModeSetToParallelError }
enum EventPriority { NormalPriority, HighPriority }

属性

公共函数

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 基于状态图的概念和符号。QStateMachine 是Qt State Machine Framework 的一部分。

状态机管理一组状态(继承自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 ,它继承于QAbstractStateQState 类提供了一个状态,当状态进入或退出时,你可以用它在QObject上设置属性和调用方法。它还包含用于添加转换的方便函数,例如本例中的QSignalTransitions。更多详情,请参阅QState 类说明。

如果遇到错误,机器将查找error state ,如果有,它将进入该状态。Error 枚举描述了可能出现的错误类型。进入错误状态后,可以使用error() 检索错误类型。进入错误状态后,状态图的执行不会停止。如果没有错误状态适用于错误状态,机器将停止执行,并将错误信息打印到控制台。

注意: 重要:将状态机的ChildMode 设置为并行 (ParallelStates) 会导致状态机无效。只能将其设置为(或保持为)ExclusiveStates

另请参阅 QAbstractState,QAbstractTransition,QStateQt State Machine 概述

成员类型文档

enum QStateMachine::Error

该枚举类型定义了状态机在运行时可能发生的错误。当状态机在运行时遇到无法恢复的错误时,它将设置error() 返回的错误代码和errorString() 返回的错误信息,并根据错误的上下文进入错误状态。

常量说明
QStateMachine::NoError0未发生错误。
QStateMachine::NoInitialStateError1机器进入了一个QState ,其子进程未设置初始状态。该错误的上下文是缺少初始状态的状态。
QStateMachine::NoDefaultStateInHistoryStateError2机器进入了没有设置默认状态的QHistoryState 。该错误的上下文是缺少默认状态的QHistoryState
QStateMachine::NoCommonAncestorForTransitionError3机器选择了一个过渡,而该过渡的源和目标不属于同一棵状态树,因此不属于同一个状态机。通常情况下,这可能意味着其中一个状态没有被赋予任何父状态或添加到任何机器中。该错误的上下文是转换的源状态。
QStateMachine::StateMachineChildModeSetToParallelError4该机器的childMode 属性被设置为QState::ParallelStates 。这是非法的。只有状态可以被声明为并行状态,状态机本身不能被声明为并行状态。该枚举值是在 Qt 5.14 中添加的。

另请参阅 setErrorState() 。

enum QStateMachine::EventPriority

该枚举类型指定了使用postEvent() 发布到状态机的事件的优先级。

高优先级的事件会在正常优先级的事件之前被处理。

常量说明
QStateMachine::NormalPriority0事件具有正常优先级。
QStateMachine::HighPriority1事件具有高优先级。

属性文档

[bindable] animated : bool

注: 该属性支持QProperty 绑定。

此属性表示是否启用动画

该属性的默认值为true

另请参见 QAbstractTransition::addAnimation()

[bindable read-only] errorString : QString

注意: 该属性支持QProperty 绑定。

此属性保存此状态机的错误字符串

[bindable] globalRestorePolicy : QState::RestorePolicy

注意: 该属性支持QProperty 绑定。

此属性保存此状态机状态的还原策略。

该属性的默认值为QState::DontRestoreProperties

running : bool

此属性保存此状态机的运行状态

访问功能:

bool isRunning() const
void setRunning(bool running)

Notifier 信号:

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 的通知信号。

另请参阅 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()。

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