目录
  • 环境配置
  • 基础
        • 状态
        • 状态转换
        • 状态机
  • 基于状态机实现一个简易的登录系统

环境配置

  1. 在Qt开发中使用状态机,需要引入StateMachine库

基础

Qt中的提供了有层次结构的有限状态机。它管理了一组状态和这些状态之间的转换,状态由QAbstractState类定义,转换是QAbstractTransition的子类。一旦构建完一个状态图,状态机就可以执行它。

状态

状态:状态可以进行嵌套,有子状态。

  1. 状态可以添加一个转换,表示从一个状态转换到另一个状态,由addTransition方法完成。这个方法使用示例如下:
// 方式1:定义从一个状态转换为另一个状态// 多个参数:当源状态触发信号时转换为目标状态
addTransition(源状态,信号,目标状态)// 方式2
transition->setTargetState(目标状态)
// 单个参数:将this作为源状态,为源状态添加一个转换(转换已经设置过了目标状态)
addTransition(QAbstractTransition *transition)
  1. 状态可以获取当前状态所属的状态机
  2. 一个状态可以包含多种事件,事件可以引起状态的转换或者状态机的停止
  3. 一个状态也包含生命周期,可以重写onExit以及onEntry函数执行进入或者结束状态以后的处理
状态转换
  1. 状态转换:从一个状态转换为另一个状态
  2. 状态之间的转换:状态机转换由一个QAbstractTransition类进行维护,sourceState()返回转换的源状态,targetStates()返回转换的目标状态,machine()返回转换所属的状态机,当转换触发时,triggered()信号会被触发。转换的过程中可以通过addAnimation()函数播放动画。另外,可以重写onTransition函数让转换触发时执行特定的处理。类中的eventTest()由状态机调用,来决定一个事件是否触发转换。
class BaseTransition : public QAbstractTransition
{
public:// 类型别名定义using OnEvent = std::function<void(QEvent*)>;            // 事件处理函数类型using OnEventTest = std::function<bool(QEvent*)>;       // 事件测试函数类型// 构造函数:接收两个回调函数BaseTransition(OnEvent on_event, OnEventTest on_event_test) : on_event_(on_event), on_event_test_(on_event_test) {}~BaseTransition() = default;protected:// 判断事件是否满足转换条件bool eventTest(QEvent* e) override { return on_event_test_(e); }// 转换时的执行动作(源状态未退出,目标状态未进入)// 这里可以做判断处理,如果void onTransition(QEvent* evt) override { on_event_(evt); }private:OnEvent on_event_;           // 存储事件处理回调OnEventTest on_event_test_;  // 存储事件测试回调
};
状态机

状态机管理一组状态之间的转换

  1. 通过addState接口为状态机添加状态
  2. 这个QStateMachine类继承自QState类,因此可以通过initialState方法设置当前状态机的初始状态
  3. 状态机中可以维护一个状态机上下文,用于状态之间共享数据

基于状态机实现一个简易的登录系统

  1. 状态机示意图如下:
    image