QT-状态机

本文介绍在LS自主研发项目上位机自检过程中,如何利用QT框架构建状态机进行复杂功能检测。主要步骤包括定义状态机、创建不同状态(如stIdle, stMain, sfDisplayOn, sfDisplayOff等)、设置状态转换、处理超时情况及添加状态切换提示。通过这种方式,可以有效地组织和管理检测流程。" 113192867,10548412,SpringBoot整合SpringMVC、MyBatis与MySQL数据库实战,"['SpringBoot', 'SpringMVC', 'MyBatis', '数据库开发', 'JavaWeb']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LS自主研发项目上位机自检
状态机,父状态,子状态,子子状态
空白状态stIdle,主状态stMain,debug主状态sfDisplayOn,debug主状态sfDisplayOff,自子状态机stLoad有些功能检测起来比较复杂,要用三四个状态组合来检查。
步骤:1,定义状态机
头文件中包含状态机类,定义并新建一个状态机(一般为指针类型变量)machine = new StateMachine(this);
2,定义并新建状态,这些状态是级别最高状态,主要是空闲stIdle,检测状态stMain,并将这些状态加入到状态机当中。并且指定当前状态书的初始状态。 machine->setInitialState(stIdle);
为主状态stMain指定初始状态。
3.用addTransition为每一个状态写好状态跳转。
4.除了要靠路状态正确跳转,还要考虑如果此状态处理不及时的情况,所以还要设置超时的跳转。
5.顺序跳转和超时跳转都设置好了,可以添加跳转时的一些汉字提示。

		代码:
QStateMachine *machine;   //state machine
QState *stIdle, *stMain;
QState *stUpBumperPress;
QState   *stUpBumperRelease;
 QState *stUpBumperCheck;
 QState  *stUpBumper;
 QFinalState *stUpBumperDone;
QTimer *upBumperPressTimer, *upBumperReleaseTimer;

machine = new QStateMachine(this);
stIdle = new QState;
stMain = new QState;
upBumperPressTimer = new QTimer(this);
upBumperReleaseTimer = new QTimer(this);
upBumperPressTimer->setInterval(keyInterval);


machine->addState(stMain);
machine->addState(stIdle);
machine->setInitialState(stIdle);//指定当前状态书的初始状态stMain->setInitialState(stLoad);

 stUpBumper = new QState(stMain);
 stUpBumperPress = new QState(stUpBumper);
 stUpBumperRelease = new QState(stUpBumper);
 stUpBumperCheck = new QState(stUpBumper);
 stUpBumperDone = new QFinalState(stUpBumper);
 stUpBumper->setInitialState(stUpBumperPress);
 
stIdle->addTransition(ui->startButton, SIGNAL(clicked()), stMain);
stMain->addTransition(stMain, SIGNAL(finished()), stIdle);
stMain->addTransition(ui->resetButton, SIGNAL(clicked()), stIdle);
stUpBumper->addTransition(stUpBumper, SIGNAL(finished()), stPowerKey);
    
stUpBumperPress->addTransition(this, SIGNAL(upBumperPressed()), stUpBumperRelease);
stUpBumperRelease->addTransition(this, SIGNAL(upBumperReleased()), stUpBumperCheck);
stUpBumperCheck->addTransition(this, SIGNAL(upBumperTested()), stUpBumperDone);

 stUpBumper->assignProperty(ui->statusLabel,"text","请按下顶部碰撞后松开");

connect(stUpBumperPress, SIGNAL(entered()), upBumperPressTimer, SLOT(start()));
connect(stUpBumperPress, SIGNAL(exited()), upBumperPressTimer, SLOT(stop()));
connect(stUpBumperRelease, SIGNAL(entered()), upBumperReleaseTimer, SLOT(start()));
connect(stUpBumperRelease, SIGNAL(exited()), upBumperReleaseTimer, SLOT(stop()));
connect(stUpBumperCheck, SIGNAL(entered()), this, SLOT(testUpBumper()));
connect(upBumperPressTimer, SIGNAL(timeout()), this, SLOT(testUpBumperPress()));
connect(upBumperReleaseTimer, SIGNAL(timeout()), this, SLOT(testUpBumperRelease()));

delete stUpBumperPress;
delete stUpBumperRelease;
delete stUpBumperCheck;
delete stUpBumperDone;
delete stUpBumper;


界面初始化的时候这些定时器要new 要给定定时器的计时时间,当线程结束时要记得timer.stop();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值