QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用
介绍
本文将介绍如何使用Qt框架实现一个简单的交通信号灯控制程序。本程序包括一个图形界面,显示红、黄、绿三色信号灯,并通过定时器控制信号灯的切换。同时,我们还将实现一个带有按钮的界面,用于展示信号灯的状态。
1. 安装Qt开发环境
如果你还没有安装Qt开发环境,请前往Qt官网下载并安装最新的Qt版本。安装过程中请确保选择了Qt Creator和相应的Qt版本(如Qt 5或Qt 6)。本文所示例子基于Qt 5.12版本实现。
2. 创建新项目
2.1 打开Qt Creator
启动Qt Creator开发环境。
2.2 创建新项目
- 在Qt Creator主界面,点击
File -> New File or Project。 - 在弹出的窗口中,选择
Application->Qt Widgets Application,然后点击Choose...按钮。 - 输入项目名称,例如
trafficlightApp,选择项目保存路径,然后点击Next。 - 选择合适的Qt版本和编译器配置,然后点击
Next。 - 确认类名设置,默认情况下,主窗口类名为
MainWindow。你可以保留默认值或者修改,点击Next。 - 点击
Finish,Qt Creator会自动生成一个新的Qt Widgets项目。
3. 设置项目结构
3.1 添加必要文件
在项目创建完成后,你可以看到Qt Creator已经为你生成了基本的项目结构。接下来,我们需要手动添加一些文件。
- 在项目视图中右键点击项目名称(
trafficlightApp),选择Add New...。 - 选择
C++ Class,然后点击Choose...。 - 输入类名为
TrafficLightWidget,基类选择QWidget,然后点击Next,再点击Finish。 - 使用相同的方法,再添加一个类
Widget,基类选择QWidget。
我们的项目结构如下:
trafficlightApp/
├── images/
│ ├── green.png
│ ├── red.png
│ └── yellow.png
├── trafficlightApp.pro
├── main.cpp
├── trafficlightwidget.cpp
├── trafficlightwidget.h
├── widget.cpp
├── widget.h
└── widget.ui
4. 编写代码
4.1 修改trafficlightApp.pro文件
编辑项目文件trafficlightApp.pro,添加资源文件信息,若为windows系统上QT Creator创建的项目trafficlightApp.pro不要修改,会自动配置;在Ubuntu系统上需要手动在文件中添加源文件和头文件等。
QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \trafficlightwidget.cpp \widget.cppHEADERS += \trafficlightwidget.h \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetDISTFILES += \images/green.png \images/red.png \images/yellow.png
4.2 编写main.cpp
#include "trafficlightwidget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);TrafficLightWidget w;w.show();return a.exec();
}
4.3 编写trafficlightwidget.h
#ifndef TRAFFICLIGHTWIDGET_H
#define TRAFFICLIGHTWIDGET_H#include <QWidget>
#include <QTimer>class TrafficLightWidget : public QWidget
{Q_OBJECTpublic:explicit TrafficLightWidget(QWidget *parent = nullptr);protected:void paintEvent(QPaintEvent *event) override;private slots:void updateLight();private:QTimer *timer;int lightIndex; // 0 for red, 1 for yellow, 2 for greenint redDuration; // Duration for red light in msint yellowDuration; // Duration for yellow light in msint greenDuration; // Duration for green light in msint elapsedTime; // Time elapsed since last change in msint remainingTime; // Remaining time for current light in secondsint getLightDuration(int light) const; // Function to get the duration for the given light
};#endif // TRAFFICLIGHTWIDGET_H
4.4 编写trafficlightwidget.cpp
#include "trafficlightwidget.h"
#include <QPainter>TrafficLightWidget::TrafficLightWidget(QWidget *parent): QWidget(parent),lightIndex(0), // Start with red lightredDuration(30000), // Red duration 30 secondsyellowDuration(3000), // Yellow duration 3 secondsgreenDuration(30000), // Green duration 30 secondselapsedTime(0), // Reset elapsed timeremainingTime(redDuration / 1000) // Start with red light's duration
{setFixedSize(200, 660); // Set the size of the traffic light widget to include countdown// Set up the timer to tick every second (1000 milliseconds)timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &TrafficLightWidget::updateLight);timer->start(1000); // Start the timer
}void TrafficLightWidget::paintEvent(QPaintEvent *)
{QPainter painter(this);QColor lightRed(255, 0, 0, 255);QColor lightYellow(255, 255, 0, 255);QColor lightGreen(0, 255, 0, 255);QColor lightOff(50, 50, 50, 255);// Draw the traffic light framepainter.setBrush(Qt::black);painter.drawRect(10, 10, 180, 580);// Draw the red lightpainter.setBrush(lightIndex == 0 ? lightRed : lightOff);painter.drawEllipse(40, 30, 120, 120);// Draw the yellow lightpainter.setBrush(lightIndex == 1 ? lightYellow : lightOff);painter.drawEllipse(40, 180, 120, 120);// Draw the green lightpainter.setBrush(lightIndex == 2 ? lightGreen : lightOff);painter.drawEllipse(40, 330, 120, 120);// Draw the countdown timerpainter.setPen(Qt::white);QFont font = painter.font();font.setPointSize(24);painter.setFont(font);QString remainingTimeString = QString::number(remainingTime);painter.drawText(QRect(40, 530, 120, 50), Qt::AlignCenter, remainingTimeString);
}void TrafficLightWidget::updateLight()
{// Update remaining time for the current lightremainingTime = (getLightDuration(lightIndex) - elapsedTime) / 1000;elapsedTime += 1000; // Add 1 second to elapsed time// Check if the current light duration has passedif (elapsedTime >= getLightDuration(lightIndex)) {lightIndex = (lightIndex + 1) % 3; // Cycle through the lightselapsedTime = 0; // Reset elapsed timeremainingTime = getLightDuration(lightIndex) / 1000; // Reset remaining time}update(); // Request a repaint
}int TrafficLightWidget::getLightDuration(int light) const
{switch (light) {case 0: return redDuration; // Red light durationcase 1: return yellowDuration; // Yellow light durationcase 2: return greenDuration; // Green light durationdefault: return 0; // Default case (should not be reached)}
}
4.5 编写widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_toolButton_clicked();void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;
};#endif // WIDGET_H
4.6 编写widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QGraphicsEffect>
#include<QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// Set up button stylesui->pushButton->setStyleSheet("border-radius: 50%; background-color: #ff0000;");ui->pushButton_2->setStyleSheet("border-radius: 50%; background-color: rgb(85, 255, 0);");
}Widget::~Widget()
{delete ui;
}void Widget::on_toolButton_clicked()
{// Placeholder for tool button click event
}void Widget::on_pushButton_clicked()
{QMessageBox::information(this,"提示:","红灯,请等待!");
}void Widget::on_pushButton_2_clicked()
{QMessageBox::information(this,"提示:","绿灯,请通行!");
}
4.7 编辑widget.ui
在Qt Designer中打开widget.ui文件:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>Widget</class><widget class="QWidget" name="Widget"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>红绿灯模拟程序</string></property><widget class="QCheckBox" name="checkBox"><property name="geometry"><rect><x>10</x><y>10</y><width>81</width><height>31</height></rect></property><property name="text"><string>CheckBox</string></property></widget><widget class="QToolButton" name="toolButton"><property name="geometry"><rect><x>710</x><y>0</y><width>71</width><height>31</height></rect></property><property name="styleSheet"><string notr="true">border-color: rgb(0, 255, 255);
border-left-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(0, 0, 0, 0), stop:0.52 rgba(0, 0, 0, 0), stop:0.565 rgba(82, 121, 76, 33), stop:0.65 rgba(159, 235, 148, 64), stop:0.721925 rgba(255, 238, 150, 129), stop:0.77 rgba(255, 128, 128, 204), stop:0.89 rgba(191, 128, 255, 64), stop:1 rgba(0, 0, 0, 0));</string></property><property name="text"><string>Click Me</string></property></widget><widget class="QPushButton" name="pushButton"><property name="geometry"><rect><x>30</x><y>100</y><width>100</width><height>100</height></rect></property><property name="styleSheet"><string notr="true">background-color:white;
border-radius:5px;
border:1px solid black;
color:#587fba;</string></property><property name="text"><string>MyButton</string></property><property name="flat"><bool>false</bool></property></widget><widget class="QPushButton" name="pushButton_2"><property name="geometry"><rect><x>330</x><y>100</y><width>100</width><height>100</height></rect></property><property name="styleSheet"><string notr="true">background-color:rgb(85, 255, 0);
border-radius:5px;
border:1px solid black;
color:#587fba;</string></property><property name="text"><string>MyButton</string></property><property name="flat"><bool>false</bool></property></widget></widget><resources/><connections/>
</ui>
配置这些控件的属性,如位置、文本内容和样式表等,可以参考前面提供的widget.ui文件内容。
5. 构建和运行项目
点击Qt Creator中的Build按钮来构建项目。如果项目配置正确且代码无误,构建过程应能成功完成。
点击Run按钮,运行程序。你将看到一个包含交通信号灯和两个按钮的窗口。红色、黄色、绿色信号灯会根据设定的时长自动切换。
运行结果展示:

通过上述详细步骤,你已经完成了一个基于Qt的简单交通信号灯控制程序的实现。希望这些说明对你有所帮助。
相关文章:
QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用
介绍 本文将介绍如何使用Qt框架实现一个简单的交通信号灯控制程序。本程序包括一个图形界面,显示红、黄、绿三色信号灯,并通过定时器控制信号灯的切换。同时,我们还将实现一个带有按钮的界面,用于展示信号灯的状态。 1. 安装Qt开…...
【编程基础知识】网络I/O模型详解:从阻塞到异步
引言 网络I/O模型是网络编程的核心,它们决定了应用程序如何进行读写操作以与网络进行数据交换。了解不同的网络I/O模型对于设计高效、可扩展的网络应用程序至关重要。 一、阻塞I/O(Blocking I/O) 1. 定义 阻塞调用:当应用程序…...
yolo自动化项目实例解析(六)自建UI(主窗口、预览窗口)
前面我们大致把各个代码块梳理出来了,但是还是不知道从那块开始,我们这里主要先通过ui页面的元素去推理整个执行过程,我们首先需要知道ui功能里面有那些组件 qt设计师基础控件 Qt Designer 是一个图形界面设计工具,用于创建 Qt 应…...
Unity优质教程分类汇总 【持续更新中】
以下收录的均为作者自己看过的觉得比较好的教程 基础 Unity入门: https://www.bilibili.com/video/BV1HX4y1V71E?p13 生命周期 https://docs.unity.cn/cn/2022.3/uploads/Main/monobehaviour_flowchart.svg https://zhuanlan.zhihu.com/p/551294000 编程技巧…...
真正掌握left join on 和 where 的差别
总结 用 where 是先连接然后再筛选用 on 是先筛选再连接数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。在使用left jion时,on和where条件的区别如下: on条件是在生成临时表…...
神经网络在多分类问题中的应用
作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~个人主页:小高要坚强的博客当前专栏:Python之机器学习本文内容:神经网络在多分类问题中的应用作者“三要”格言:要坚强、要努力、要学习 目录 1. 引言 2.数据构造 3.划分数据集 4.神经网络实现多…...
nginx的安装和使用
源码安装 1.环境准备:卸载其他方式安装的web应用,防止端口冲突 2.下载nginx源码包 wget https://nginx.org/download/nginx-1.20.2.tar.gz 3.源码编译安装 yum install -y gcc pcre-devel zlib-devel #安装依赖包 useradd -M -s /sbin/nologin ngi…...
js采用覆盖键、覆盖鼠标滑动事件实现禁止网页通过 ctrl + +/- 和 ctrl + 滚轮 对页面进行缩放
一、兼容电脑端的禁止通过 ctrl /- 和 ctrl 滚轮 对页面进行缩放 const keyCodeMap {// 91: true, // command61: true,107: true, // 数字键盘 109: true, // 数字键盘 -173: true, // 火狐 - 号187: true, // 189: true, // -};二、覆盖ctrl||command ‘’/‘-’ // 覆…...
某客户Oracle RAC无法启动故障快速解决
某日,9:50左右接到好友协助需求,某个客户Oracle RAC无法启动,并发过来一个报错截图,如下: 和客户维护人员对接后,远程登录服务端进行故障分析。 查看hosts信息,首先进行心跳测试,测…...
【计算机网络 - 基础问题】每日 3 题(二十八)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...
探索甘肃非遗:Spring Boot网站开发案例
1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前&#…...
产品管理- 互联网产品(6):产品测试
可用性测试 招募有代表性用户作为测试代表参与者,评估某产品符合特定可用性及符合程度。以具有代表性的用户为测试样本。 测试中多关注用户表情与动作。多鼓励与测试的用户更多的操作以用户角度发现问题。同时要做好询问工作,耐心聆听用户的意见&#x…...
奖金高达 110 万元,Spatial Joy 2024 全球 AR 应用开发大赛启动
今年是AR应用开发大赛第三届,恰逢Rokid成立十周年,我们推出全新的大赛品牌“Spatial Joy”,引领开发者享受开发乐趣,为其打造充满挑战和惊喜的开发之旅,逐渐成为空间计算时代全球最大AR应用开发大赛。回顾大赛发展&…...
git add成功后忘记commit的文件丢了?
本文目标:开发人员,在了解git fsck命令用法的条件下,进行git add成功但由于误操作导致丢失的文件找回,达到找回丢失文件的程度。 文章目录 1 痛点2 解决方案3 总结/练习 1 痛点 开发过程中,分支太多(基线分…...
Python Web 开发中的DevOps 实践与自动化运维
Python Web 开发中的DevOps 实践与自动化运维 📚 目录 🔧 基础设施即代码(IaC) 使用 Terraform、AWS CloudFormation 实现基础设施即代码使用 Python 进行云服务资源的管理与自动化配置编写和部署基础设施的自动化脚本 …...
探索私有化聊天软件:即时通讯与音视频技术的结合
在数字化转型的浪潮中,企业对于高效、安全、定制化的通讯解决方案的需求日益迫切。鲸信,作为音视频通信技术的佼佼者,凭借其强大的即时通讯与音视频SDK(软件开发工具包)结合能力,为企业量身打造了私有化聊天…...
性能调优知识点(mysql)三
SQL底层执行原理 MySQL的内部组件结构:大体来说,MySQL 可以分为 Server 层和存储引擎层store两部分 Server层:主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数…...
TinyWebSever项目面试题整理
TinyWebSever项目面试题整理 1.为什么要做这样一个项目? 满足高并发和高性能需求:现代Web应用面对大量用户,Web服务器需要高效处理并发连接。比如通过线程池、非阻塞I/O、事件驱动机制(如epoll),Web服务器…...
维修保养记录接口-维修保养记录API-汽车接口
维修保养记录接口的使用主要涉及到API对接和在线查询两种方式。以下是详细的使用步骤和注意事项: 一、API对接 注册与申请: 首先,你需要在提供维修保养记录接口的平台(如挖数据平台、第三方数据服务商等)进行注册&…...
基于 RealSense D435相机实现手部姿态检测
基于 RealSense D435i相机进行手部姿态检测,其中采用 Mediapipe 进行手部检测,以下是详细步骤: Mediapipe 是一个由 Google开发的开源框架,专门用于构建多媒体处理管道,特别是计算机视觉和机器学习任务。它提供了一系列…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
