发布时间:2023-10-24 18:00
简单来说,Qt状态机就是从一个状态转换到另外一个状态,就好像电视机换台一样,当我点击换台按钮的时候,我就从A频道转到B频道了。
电视机就相当于状态机:类名为QStateMachine
电视机当前播放的频道就相当于一个状态:类名为QState
而当我点击换台按钮的时候就相当于一个转换操作:类名为QAbstractTransition
(实际使用的为它的子类)
草图如下(s1, s2, s3为状态名,该文章演示例子是这样命名的):
状态机相当于一个容器,主要用来装多个状态(QState
)
状态机的类名为:QStateMachine
状态类名:QState
状态中有两个主要的函数为:
onEntry()
onExit()
当调用onEntry()函数后,会触发进入状态信号entered()
当调用onExit()函数后,会触发退出状态信号exited()
转换就相当于是从一个状态转换到另一个状态的触发条件,触发的对象是谁,触发的信号/事件是什么,触发后转换到哪个状态都是由转换类设置的。
转换类又分为两个(是QAbstractTransition的直接子类),如下:
信号转换类:
QSignalTransition
事件转换类:QEventTransition
本文章例子只使用了信号转换类
下面结合例子来理解:
例子创建了一个QWidget类,在这个窗体中有一个按钮,和一个标签,如下
例子代码:
具体实现功能说明:刚运行时初始化的状态为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状态机的详细介绍和使用不做说明,感兴趣的可以自己去查找资料。
若文章有错误处,请各位大佬赐教,予以更正,谢谢。