当前位置: 首页> 教育> 幼教 > QStateMachine 笔记

QStateMachine 笔记

时间:2025/7/19 4:50:21来源:https://blog.csdn.net/github_37290846/article/details/139628966 浏览次数:0次

QStateMachine 是 Qt 框架中用于实现状态机的类。状态机是一种模型,它由一系列状态组成,每个状态对应于系统的一个特定行为模式。状态机可以根据外部事件或内部条件在不同的状态之间转换。

基本概念:

  • 状态(State)‌:系统的某个特定行为模式。
  • 转换(Transition)‌:状态之间的迁移,通常由事件触发。
  • 初始状态(Initial State)‌:状态机的起始状态。
  • 最终状态(Final State)‌:状态机的结束状态。

使用场景:

  • GUI 应用程序:管理窗口的不同状态,如最小化、最大化、关闭等。
  • 游戏开发:管理游戏角色的不同状态,如行走、跳跃、攻击等。
  • 嵌入式系统:管理设备的不同工作模式,如待机、运行、故障等。

功能:

  • 状态管理:添加、移除和查找状态。
  • 转换管理:添加、移除和查找转换。
  • 事件处理:响应外部事件来触发状态转换。
  • 状态监听:监听状态的变化和转换的发生。

参数:

  • QStateMachine 本身没有特定的参数,但它管理的状态和转换有自己的属性。

注意事项:

  • 状态的唯一性:每个状态应该是唯一的,可以通过 QState::objectName 来区分。
  • 转换的目标状态:转换必须有一个明确的目标状态。
  • 状态的层级关系:状态可以有父子关系,形成层级结构。
  • 状态的历史记录:可以使用 QHistoryState 来保存历史状态,以便以后恢复。

示例代码:


#include <QStateMachine>
#include <QState>
#include <QPushButton>QStateMachine machine = new QStateMachine();
QState s1 = new QState();
QState s2 = new QState();
s1->setObjectName("State1");
s2->setObjectName("State2");
QObject::connect(s1, &QState::entered, { qDebug() << "Entered State1"; });
QObject::connect(s2, &QState::entered, { qDebug() << "Entered State2"; });
QPushButton button = new QPushButton("Start");
QObject::connect(button, &QPushButton::clicked, machine, &QStateMachine::start);
QPushButton toggleButton = new QPushButton("Toggle State");
QObject::connect(toggleButton, &QPushButton::clicked, {if (s1->isActive()) {s1->setInitialState(s2);} else {s1->setInitialState(nullptr);}});
machine->addState(s1);
machine->addState(s2);
machine->setInitialState(s1);
s1->addTransition(toggleButton, &QPushButton::clicked, s2);
s2->addTransition(toggleButton, &QPushButton::clicked, s1);
machine->start();

在这个示例中,我们创建了一个简单的状态机,它有两个状态 s1s2。我们还创建了两个按钮,一个用于启动状态机,另一个用于在两个状态之间切换。当状态机启动时,它首先进入 s1 状态。每当切换按钮被点击时,状态机会在 s1s2 之间切换。

关键字:QStateMachine 笔记

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: