目录
- 环境配置
- 基础
- 状态
- 状态转换
- 状态机
- 基于状态机实现一个简易的登录系统
环境配置
- 在Qt开发中使用状态机,需要引入StateMachine库
基础
Qt中的提供了有层次结构的有限状态机。它管理了一组状态和这些状态之间的转换,状态由QAbstractState类定义,转换是QAbstractTransition的子类。一旦构建完一个状态图,状态机就可以执行它。
状态
状态:状态可以进行嵌套,有子状态。
- 状态可以添加一个转换,表示从一个状态转换到另一个状态,由addTransition方法完成。这个方法使用示例如下:
// 方式1:定义从一个状态转换为另一个状态// 多个参数:当源状态触发信号时转换为目标状态
addTransition(源状态,信号,目标状态)// 方式2
transition->setTargetState(目标状态)
// 单个参数:将this作为源状态,为源状态添加一个转换(转换已经设置过了目标状态)
addTransition(QAbstractTransition *transition)
- 状态可以获取当前状态所属的状态机
- 一个状态可以包含多种事件,事件可以引起状态的转换或者状态机的停止
- 一个状态也包含生命周期,可以重写onExit以及onEntry函数执行进入或者结束状态以后的处理
状态转换
- 状态转换:从一个状态转换为另一个状态
- 状态之间的转换:状态机转换由一个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_; // 存储事件测试回调
};
状态机
状态机管理一组状态之间的转换
- 通过addState接口为状态机添加状态
- 这个QStateMachine类继承自QState类,因此可以通过initialState方法设置当前状态机的初始状态
- 状态机中可以维护一个状态机上下文,用于状态之间共享数据
基于状态机实现一个简易的登录系统
- 状态机示意图如下:
![image]()

