1.简单介绍
【QT|Qt状态机的使用】简单来说,Qt状态机就是从一个状态转换到另外一个状态,就好像电视机换台一样,当我点击换台按钮的时候,我就从A频道转到B频道了。
电视机就相当于状态机:类名为QStateMachine
电视机当前播放的频道就相当于一个状态:类名为QState
而当我点击换台按钮的时候就相当于一个转换操作:类名为QAbstractTransition
(实际使用的为它的子类)
草图如下(s1, s2, s3为状态名,该文章演示例子是这样命名的):
文章图片
2.状态机
状态机相当于一个容器,主要用来装多个状态(QState
)
状态机的类名为:QStateMachine
3.状态
状态类名:QState
状态中有两个主要的函数为:
onEntry()当调用onEntry()函数后,会触发进入状态信号
onExit()
entered()
当调用onExit()函数后,会触发退出状态信号
exited()
4.转换
转换就相当于是从一个状态转换到另一个状态的触发条件,触发的对象是谁,触发的信号/事件是什么,触发后转换到哪个状态都是由转换类设置的。
转换类又分为两个(是QAbstractTransition的直接子类),如下:
信号转换类:本文章例子只使用了信号转换类QSignalTransition
事件转换类:QEventTransition
5.具体例子
下面结合例子来理解:
例子创建了一个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状态机的详细介绍和使用不做说明,感兴趣的可以自己去查找资料。
若文章有错误处,请各位大佬赐教,予以更正,谢谢。
推荐阅读
- Qt探索之旅|Qt实现思维导图功能(二)
- C++|Qt-Q_OBJECT宏及控件提升导致的类重定义问题
- C++学习|C++从文件中提取英文单词
- Qt学习之路|Qt项目-安防监控系统(欢迎登录注册)
- Qt学习之路|Qt项目-安防监控系统(MVC设计模式)
- C语言学习|C语言做一个简易的登陆验证(功能)界面
- C和指针|C和指针 第6章 指针 6.4 间接访问操作符
- #|c++中的四种类型转换
- C++|C++中四种类型转换方式__笔记