Qt状态机场景模拟

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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨田哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值