QT|Qt状态机的使用

1.简单介绍
【QT|Qt状态机的使用】简单来说,Qt状态机就是从一个状态转换到另外一个状态,就好像电视机换台一样,当我点击换台按钮的时候,我就从A频道转到B频道了。
电视机就相当于状态机:类名为QStateMachine
电视机当前播放的频道就相当于一个状态:类名为QState
而当我点击换台按钮的时候就相当于一个转换操作:类名为QAbstractTransition(实际使用的为它的子类)
草图如下(s1, s2, s3为状态名,该文章演示例子是这样命名的):
QT|Qt状态机的使用
文章图片

2.状态机
状态机相当于一个容器,主要用来装多个状态(QState)
状态机的类名为:QStateMachine
3.状态
状态类名:QState
状态中有两个主要的函数为:

onEntry()
onExit()
当调用onEntry()函数后,会触发进入状态信号entered()
当调用onExit()函数后,会触发退出状态信号exited()
4.转换
转换就相当于是从一个状态转换到另一个状态的触发条件,触发的对象是谁,触发的信号/事件是什么,触发后转换到哪个状态都是由转换类设置的。
转换类又分为两个(是QAbstractTransition的直接子类),如下:
信号转换类:QSignalTransition
事件转换类:QEventTransition
本文章例子只使用了信号转换类
5.具体例子
下面结合例子来理解:
例子创建了一个QWidget类,在这个窗体中有一个按钮,和一个标签,如下
QT|Qt状态机的使用
文章图片

例子代码:
具体实现功能说明:刚运行时初始化的状态为s1,并且在标签上显示出来,当点击按钮时,会转换到状态s2,当再点击按钮时又会转到s3,再点又会转到s1,以此循环。
下面注释的代码和 三行单独的addTransition()函数实现的功能相同。
可以把代码拷贝过去,自己跑跑就好理解了。
具体实现的函数功能,注释已作出说明。
// 创建状态机 QStateMachine* mach = new QStateMachine(this); // 创建状态对象 QState *s1 = new QState; QState *s2 = new QState; QState *s3 = new QState; //// 创建信号转换对象 //QSignalTransition *ss1 = new QSignalTransition; //QSignalTransition *ss2 = new QSignalTransition; //QSignalTransition *ss3 = new QSignalTransition; //// 给状态转换添加触发对象 //ss1->setSenderObject(ui->pushButton); // 设置信号发送方对象 //ss1->setSignal("clicked()"); // 设置信号函数 //ss1->setTargetState(s2); // 设置要转换的状态//ss2->setSenderObject(ui->pushButton); //ss2->setSignal("clicked()"); //ss2->setTargetState(s3); //ss3->setSenderObject(ui->pushButton); //ss3->setSignal("clicked()"); //ss3->setTargetState(s1); //// 给状态对象添加转换对象 //s1->addTransition(ss1); //s2->addTransition(ss2); //s3->addTransition(ss3); // 设置触发对象,触发对象的响应信号,触发后转到哪个状态 s1->addTransition(ui->pushButton, &QPushButton::clicked, s2); s2->addTransition(ui->pushButton, &QPushButton::clicked, s3); s3->addTransition(ui->pushButton, &QPushButton::clicked, s1); // 将状态添加到状态机 mach->addState(s1); mach->addState(s2); mach->addState(s3); // 设置初始化状态(即刚开始运行的那个状态) mach->setInitialState(s1); // 设置当进入当前状态时,给指定对象的指定属性设置指定值 s1->assignProperty(ui->label, "text", "状态1"); s2->assignProperty(ui->label, "text", "状态2"); s3->assignProperty(ui->label, "text", "状态3"); // 启动状态机 mach->start();

Qt状态机的详细介绍和使用不做说明,感兴趣的可以自己去查找资料。
若文章有错误处,请各位大佬赐教,予以更正,谢谢。

    推荐阅读