环境配置
- 在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]()

浙公网安备 33010602011771号