QStateMachine 笔记

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 之间切换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值