Linux QT模拟交通灯系统

该博客介绍了如何设计一个十字路口交通灯控制系统,包括红绿灯的绘制、时间设置、主次干道时间切换以及人行横道信号灯的闪烁功能。通过使用QLabel进行交通灯状态显示,并利用QTimer进行时间控制。此外,还提供了交通灯时间的初始设定以及按钮触发的主次干道时间切换功能。

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

基本要求:

(1)在十字交叉路口,东南西北各方向都设置红、黄、绿色信号灯,红灯亮表示禁止通行,绿灯亮表示可以通行,红灯灭之前5秒钟黄灯开始闪烁知道绿灯亮后黄灯熄灭。其中东西方向为主干道,南北方向为次干道,各个方向分别设置两位数码管,用来表示红灯和绿色倒计时间,东西方向时间一致,南北方向时间一致。

(2)启动时主干道为60秒倒计时,次干道为40秒倒计时

(3)单独设计人行指示灯标志,当禁止行走时为红灯,当可以横穿马路时,绿灯亮起。在禁止通行之前10秒钟开始闪烁(以警示行人),最终红灯亮起绿灯熄灭。

整体界面

 部分功能:

1、交通灯绘制

void MainWindow::SetLed(QLabel* label, int color, int size,int type)
{
    // 将label中的文字清空
    label->setText("");
    // 先设置矩形大小
    // 如果ui界面设置的label大小比最小宽度和高度小,矩形将被设置为最小宽度和最小高度;
    // 如果ui界面设置的label大小比最小宽度和高度大,矩形将被设置为最大宽度和最大高度;
    QString min_width = QString("min-width: %1px;").arg(size);              // 最小宽度:size
    QString min_height = QString("min-height: %1px;").arg(size);            // 最小高度:size
    QString max_width = QString("max-width: %1px;").arg(size);              // 最小宽度:size
    QString max_height = QString("max-height: %1px;").arg(size);            // 最小高度:size
    // 再设置边界形状及边框
    QString border_radius = QString("border-radius: %1px;").arg(size/2);    // 边框是圆角,半径为size/2
    QString border;                 // 边框为1px黑色
    // 最后设置背景颜色
    QString background = "background-color:";
    switch (color) {
    case 0:
        // 灰色
        if(type == 1)
            border = QString("border:2px solid rgb(255,0,0);");
        else if(type ==2)
            border = QString("border:2px solid rgb(0,255,0);");
        else if(type ==3)
            border = QString("border:2px solid rgb(255,255,0);");
        break;
    case 1:
        // 红色
        background += "rgb(255,0,0)";
        border = QString("border:1px solid red;");
        break;
    case 2:
        // 绿色
        background += "rgb(0,255,0)";
        border = QString("border:1px solid green;");
        break;
    case 3:
        // 黄色
        background += "rgb(255,255,0)";
        border = QString("border:1px solid yellow;");
        break;
    case 4:
        // 黄色
        background += "rgb(255,255,255)";
        break;
    default:
        break;
    }
    const QString SheetStyle = min_width + min_height + max_width + max_height + border_radius + border + background;
    label->setStyleSheet(SheetStyle);
}

2、十字路口绘制

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QPen pen;
    pen.setColor(Qt::black);
    pen.setWidth(3);
    painter.setPen(pen);
    painter.drawLine(370,50,370,190);//画直线
    painter.drawLine(230,190,370,190);//画直线

    .....
    painter.drawLine(550,350,550,490);//画直线
    painter.drawLine(550,350,690,350);//画直线


}

3、设置交通灯的时间

void MainWindow::LightTime()
{
    //初始化变量
    count_red1 = 60;
    count_green1 = -1;
    count_yellow1 = 3;
    count_red2 = -1;
    count_green2 = 60;
    count_yellow2 = 3;

    //显示红绿灯时间
    ui->lcd_e->display(count_green2);

    ui->lcd_n->display(count_red1);

    myTimer = new QTimer();
    myTimer->start(1000);    //启动QTimer
    connect(myTimer,SIGNAL(timeout()),
            this,SLOT(doProcessTimeOut1()));//绑定槽
    connect(myTimer,SIGNAL(timeout()),
            this,SLOT(doProcessTimeOut2()));//绑定槽
}

4、切换主次干道时间(切记要重启一下定时器strart())

void MainWindow::on_btn_change_clicked()
{
    if(m_nClickCnt >=1)
    {
        m_nClickCnt = 0;
    }else
    {
        m_nClickCnt +=1;

    }
}

需要完整代码请私信

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值