第4篇 Qt实现十字路口交通灯控制系统(三)

第4篇 Qt实现十字路口交通灯控制系统(三)

1.灯控制类LampControl

这里要先说一下这个控制是怎么实现的,我们的目的在于:在整个程序运行的过程中,让时间按秒递减,当时间为零时,更换灯的状态,且更换绿灯的显示位置,或者更换要控制的灯组,且每一秒向界面发送重绘请求信号,以达到可以看到倒计时的目的。
因此,我们用线程来实现这个目的,至于什么是线程,Qt中线程类是怎样的,我也不大清楚,想更清楚的话去C一下就好了,CSDN有很多。
这个类主要继承于QThread(线程类里面包含了QObject类)

1.1.属性

(1)时间:ewtime,sntime
东西方向显示的时间:ewtime和南北方向显示的时间:sntime,这两个时间是不一样的,以此作为区别。两个都是int类型,初始值为ewtime = 30,sntime = 10;(即10秒更换一次灯的状态,20秒更换一次灯组)
(2)当前灯组:lampGroup
记录当前要控制的灯组:主要有南北灯组和东西灯组,因为南北方向直行或者左转都是同步进行的,东西方亦是如此。两个灯组更替交换。为QString类型,取值为:NS和WE,先NS再WE
(3)当前控制灯的位置:lampLocation
记录当前所控制灯组的灯的位置,即是中间灯,还是左边灯。改变量为QString类型,取值为midlle何left,先midlle再left

1.2.操作

(1)int getEWtime();
获取东西方时间,用于界面显示使用。
(2)int getSNtime();
获取南北方的时间,用于界面显示使用。
(3)explicit LampControl();
初始化设置,避免出错。即设置当前灯组,当前灯的位置,时间。
(4)void run();
QThread类需要重写的函数,即当线程启动后,执行的方法体。
因为我们要一直去检测灯的状态和减少时间,设置时间,所以我们把要实现的东西加入一个while循环里,且循环条件一直为真,关闭窗口是会调用线程处理函数来结束线程运行。

算法就是:
进去时是南北的执行灯为绿,左转灯为红,东西方的直行灯和左转灯都为红,即初始
灯组为NS,位置为middle,sntime = 10,ewtime = 30
当sntime 为0时,重置sntime为10,把灯的位置改为left,即到南北方向左转的车辆通过路口;当sntime再为0时,改变灯组为WE,灯的位置为midlle,即到东西方向直行的车辆通过,此时ewtime为10,sntime为30;当ewtime为0时,重置ewtime为10,改变等的位置为left,即到东西方左转的车辆通过路口,当ewtime再次为0时,改变灯组为NS,灯的位置为middle。以此循环。
其实可以使用switch实现的,但是Qt不支持开关为QSting,所以就直接用if_else语句了,关键在于也不多。当然,也可以用常量来实现表示灯组和当前位置,就可以用switch来实现了。

1.3.信号

(1)void updateMain();
每次检测后发出重绘请求信号。
(2)void lampChange(QString group,QString location,bool status);
如果需要更换状态,则发出此信号,按对应的灯改变其状态。

1.4.头文件

#ifndef LAMPCONTROL_H
#define LAMPCONTROL_H

#include <QObject>
#include <QString>
#include <QThread>

class LampControl : public QThread
{
    Q_OBJECT
public:
    explicit LampControl();
    void run();

signals:
    void updateMain();
    void lampChange(QString group,QString location,bool status);
public slots:

public:
    int getEWtime();
    int getSNtime();
private:
    int ewtime;//东西灯时间
    int sntime;//南北灯时间
    QString lampGroup;//当前灯组
    QString lampLocation;//当前灯的位置
};

#endif // LAMPCONTROL_H

1.5.源文件

#include "lampcontrol.h"

LampControl::LampControl()
{
    this->sntime = 10;
    this->ewtime = 30;
    this->lampGroup = "NS";
    this->lampLocation = "middle";
}

void LampControl::run(){
    while(true){
        QThread::msleep(1000);
        emit updateMain();
        this->ewtime--;
        this->sntime--;

        if(this->lampGroup == "NS"){
            if(this->lampLocation == "middle"){
                if(this->sntime > 0){
                    emit lampChange(this->lampGroup,this->lampLocation,true);
                }
                else{
                    this->sntime = 10;
                    emit lampChange(this->lampGroup,this->lampLocation,false);
                    this->lampLocation = "left";
                    emit lampChange(this->lampGroup,this->lampLocation,true);
                }
            }
            else if(this->lampLocation == "left"){
                if(this->sntime > 0){
                    emit lampChange(this->lampGroup,this->lampLocation,true);
                }
                else{
                    emit lampChange(this->lampGroup,this->lampLocation,false);
                    this->sntime = 30;
                    this->lampGroup = "WE";
                    this->lampLocation = "middle";
                    emit lampChange(this->lampGroup,this->lampLocation,true);
                }
            }
        }
        else if(this->lampGroup == "WE"){
            if(this->lampLocation == "middle"){
                if(this->ewtime > 0){
                    emit lampChange(this->lampGroup,this->lampLocation,true);
                }
                else{
                    this->ewtime = 10;
                    emit lampChange(this->lampGroup,this->lampLocation,false);
                    this->lampLocation = "left";
                    emit lampChange(this->lampGroup,this->lampLocation,true);
                }
            }
            else if(this->lampLocation == "left"){
                if(this->ewtime > 0){
                    emit lampChange(this->lampGroup,this->lampLocation,true);
                }
                else{
                    emit lampChange(this->lampGroup,this->lampLocation,false);
                    this->ewtime = 30;
                    this->lampGroup = "NS";
                    this->lampLocation = "middle";
                    emit lampChange(this->lampGroup,this->lampLocation,true);
                }
            }
        }
    }
}

int LampControl::getEWtime(){
    return this->ewtime;
}

int LampControl::getSNtime(){
    return this->sntime;
}

2.结语

如果需要用到信号和槽的话,一定要有QObject这个基类,不然的话不能进行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大唐不良猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值