Qt状态机的使用

1.简单介绍

简单来说,Qt状态机就是从一个状态转换到另外一个状态,就好像电视机换台一样,当我点击换台按钮的时候,我就从A频道转到B频道了。

电视机就相当于状态机:类名为QStateMachine
电视机当前播放的频道就相当于一个状态:类名为QState
而当我点击换台按钮的时候就相当于一个转换操作:类名为QAbstractTransition(实际使用的为它的子类)
草图如下(s1, s2, s3为状态名,该文章演示例子是这样命名的):
Qt状态机的使用_第1张图片

2.状态机

状态机相当于一个容器,主要用来装多个状态(QState)
状态机的类名为:QStateMachine

3.状态

状态类名:QState
状态中有两个主要的函数为:

onEntry()
onExit()

当调用onEntry()函数后,会触发进入状态信号entered()
当调用onExit()函数后,会触发退出状态信号exited()

4.转换

转换就相当于是从一个状态转换到另一个状态的触发条件,触发的对象是谁,触发的信号/事件是什么,触发后转换到哪个状态都是由转换类设置的。

转换类又分为两个(是QAbstractTransition的直接子类),如下:

信号转换类:QSignalTransition
事件转换类:QEventTransition

本文章例子只使用了信号转换类

5.具体例子

下面结合例子来理解:
例子创建了一个QWidget类,在这个窗体中有一个按钮,和一个标签,如下
Qt状态机的使用_第2张图片

例子代码:

具体实现功能说明:刚运行时初始化的状态为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状态机的详细介绍和使用不做说明,感兴趣的可以自己去查找资料。

若文章有错误处,请各位大佬赐教,予以更正,谢谢。

你可能感兴趣的:(QT,qt,ui,c++)