添加模块
| CMake | find_package(Qt6 REQUIRED COMPONENTS StateMachine)target_link_libraries(mytarget PRIVATE Qt6::StateMachine) |
| qmake | QT += statemachine |
了解
- 分层有限状态机(分层即 有主状态机 且 每种状态下可能有子状态机)
- 执行算法基于状态图 XML(SCXML)算法。
知识点
- 状态类 QAbstractState
- QState 基础状态
- QHistoryState 执行完任务后自动返回上一个状态
- QFinalState 结束状态
- 状态转换类 QAbstractTransition
- 无信号,立即转移:addTransition(QAbstractState *target)
- 触发了信号才会转移:
addTransition(const QObject *sender, PointerToMemberFunction signal,QAbstractState *target);
- 添加/删除状态 addState()/removeState()
- 必须设置初始状态 setInitialState(QAbstractState *state) 再 start()状态机
- 如果遇到错误,状态机会进入错误状态,除非遇到未定义的错误,状态机才会停止。
———— ● ———— ● ———— ● ———— ● ————
练习1:掌握最基础的框架——三态循环
目标:总共有3种状态:s1,s2,s3;状态循环:s1->s2->s3->s1;实现按下next按钮,切换下一个状态;QLabel显示当前状态。
//UIQPushButton *nextButton = new QPushButton("next",this);QLabel *label = new QLabel(this);//1.创建状态机QStateMachine *machine = new QStateMachine(this);//2.创建基础状态 指定父对象避免泄露也更清晰QState *s1 = new QState(machine);QState *s2 = new QState(machine);QState *s3 = new QState(machine);//3.给每个状态分配修改属性的工作s1->assignProperty(label,"text","当前处于s1状态");s2->assignProperty(label,"text","当前处于s2状态");s3->assignProperty(label,"text","当前处于s3状态");//4.按下next按钮是触发状态切换的信号s1->addTransition(nextButton,&QPushButton::clicked,s2);s2->addTransition(nextButton,&QPushButton::clicked,s3);s3->addTransition(nextButton,&QPushButton::clicked,s1);//5.把状态放进状态机machine->addState(s1);machine->addState(s2);machine->addState(s3);//6.设置初始状态machine->setInitialState(s1);//7.启动状态机machine->start();
