Qt状态机场景模拟
效果图
因录制问题,效果不是很好,这里截了部分状态图
1.
2.
3.
QState状态机创建红绿灯
QState *createLightState(LightWidget *light, int duration, QState *parent = 0)
{
//状态添加
QState *lightState = new QState(parent);
//为状态添加一个定时器
QTimer *timer = new QTimer(lightState);
timer->setInterval(duration);
timer->setSingleShot(true);
QState *timing = new QState(lightState);
//状态开启时,灯亮
QObject::connect(timing, SIGNAL(entered()), light, SLOT(turnOn()));
//状态开启时,开始定时器
QObject::connect(timing, SIGNAL(entered()), timer, SLOT(start()));
//状态结束时,灯灭
QObject::connect(timing, SIGNAL(exited()), light, SLOT(turnOff()));
//状态结束时,发出一个结束信号(这里是为了告诉小车,绿灯状态下,小车过马路)
connect(lightState, &QState::finished, [this, light](){
emit signalCurLightColor(light->getLightColor());
});
//终止状态
QFinalState *done = new QFinalState(lightState);
//定时器结束时,结束状态
timing->addTransition(timer, SIGNAL(timeout()), done);
lightState->setInitialState(timing);
return lightState;
}
//创建一个状态机
QStateMachine *machine = new QStateMachine(this);
//红灯状态
QState *redLight = createLightState(widget->redLight(), 1000);
redLight->setObjectName("redLight");
//黄灯状态
QState *yellowLight = createLightState(widget->yellowLight(), 1000);
yellowLight->setObjectName("yellowLight");
//绿灯状态
QState *greenLight = createLightState(widget->greenLight(), 3000);
greenLight->setObjectName("greenLight");
//红灯------>黄灯 切换
redLight->addTransition(redLight, SIGNAL(finished()), yellowLight);
//黄灯------>绿灯 切换
yellowLight->addTransition(yellowLight, SIGNAL(finished()), greenLight);
//绿灯------>红灯 切换
greenLight->addTransition(greenLight, SIGNAL(finished()), redLight);
machine->addState(redLight);
machine->addState(yellowLight);
machine->addState(greenLight);
machine->setInitialState(redLight);
machine->start();
动画控制小车移动
QPropertyAnimation *animation = new QPropertyAnimation(m_carWidget, "pos");
animation->setDuration(2500);
animation->setEndValue(QPoint(200, 300));
animation->start(QAbstractAnimation::DeleteWhenStopped);
结尾
只为记录,只为分享! 愿所写能对你有所帮助。Good Good Study, Day Day Up!
主要代码都在上面,工程就不上传了,需要工程文件的,留言,或者加QQ。我发给各位。状态机那块,参考了QtDemo