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

1.最终效果

以下就是我设计出来的效果,没有录视频,就先这样了:
在这里插入图片描述在这里插入图片描述

2.相关问题解决

2.1.信号与槽问题

(1)用到信号和槽机制的类一定要有QObject这个基类
(2)关联方式
QObject::connect(发出者,SIGNAL(信号),接收者,SLOT(槽));
发出者和接收者都是地址,
如Car *car1;Car car2;这两个关联为
QObject::connect(car1,SIGNAL(信号),接收者,SLOT(槽));
QObject::connect(&car2,SIGNAL(信号),接收者,SLOT(槽));

还有一种方式是
QObject::connect(发出者,发出者类::信号名,接收者,接受者类::槽名);
QObject::connect(car1,Car::updateMain,接收者,Map::updateMyself);

2.2.线程问题

线程可以继承QThread也可以继承QRunnable类,两者都要重写run()函数。需要注意的是前者继承了QObject,而后者没有。使用后者并且要有信号和槽机制的话,要这样继承才不会报错:

class LoadTableRunable : public QObject , public QRunnable {
	Q_OBJECT
public:
	LoadTableRunable(QObject *parent);
	~LoadTableRunable();
	void run();
signals:
public slots:
};

问题:
线程问题这是因为没有结束掉线程,在相关地方添加关闭线程代码就好了:
我是在关闭事件中加的。

void Map::closeEvent(QCloseEvent *){
    control.terminate();
    controlcar.terminate();
    car->terminate();
    for(int i = 0;i < listAll.size();i++){
        listAll.at(i)->terminate();
    }
}

2.3.转弯问题

写下来感觉Qt的转弯虽然看起来还挺简单的,但没有javaSwing那样好,不过也许是我没有发现好的方法吧:
下面这篇文章说得很清楚,我主要用到第一种方法。
本来可以模拟车辆行驶更好的左转的,但是,Qt图片旋转会改变大小,所以左转也用了90度,会出现撞车的情况。

Qt实现图片旋转的两种方法

2.4.静态变量与静态函数

静态变量和静态函数可以一处声明,多处使用,和全局变量一样,但是面向对象讲究的就是封装性,是谁的就放在谁那里,而不是放在外面成为野孩子,所以才不建议使用extern。

Qt使用全局变量的两种方式

3.bug

出界访问这个问题不知道要怎么解决,因为在每个线程应该结束时我都把车子删除了,但我想了想,觉得应该是很多个线程同时进行时,线程a要释放了,但是又没有完全释放,所以线程b用到线程a时,a又刚好释放了,就越界了:比如我用的是listAll保存车子,那么应该是在删除车子a时,车子b要求重绘,又刚好访问到车子a,所以就出现了越界访问,因为时间间隔是64毫秒,还是有点短的。

4.结语

凑合吧。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,我可以帮您解答。如果您想在Qt实现LED交通灯的亮灭,可以通过以下步骤进行: 1. 创建一个新的Qt工程,并添加三个QLabel控件,分别代表红灯、黄灯和绿灯。 2. 设置QLabel的背景色,分别设置红色、黄色和绿色。 3. 在Qt中使用QTimer类,定时器每隔一段时间就切换灯的状态。例如,红灯亮10秒,黄灯亮3秒,绿灯亮15秒,然后再切换到红灯。 4. 在QTimer的槽函数中,根据当前灯的状态,改变对应QLabel的背景色,从而实现LED交通灯的亮灭。 以下是一个简单的示例代码: ``` #include <QtWidgets> class TrafficLight : public QWidget { public: TrafficLight(QWidget *parent = nullptr) : QWidget(parent) { QHBoxLayout *layout = new QHBoxLayout(this); layout->addWidget(redLabel = new QLabel); layout->addWidget(yellowLabel = new QLabel); layout->addWidget(greenLabel = new QLabel); redLabel->setFixedSize(50, 50); yellowLabel->setFixedSize(50, 50); greenLabel->setFixedSize(50, 50); redLabel->setAutoFillBackground(true); yellowLabel->setAutoFillBackground(true); greenLabel->setAutoFillBackground(true); redLabel->setStyleSheet("background-color: red;"); yellowLabel->setStyleSheet("background-color: gray;"); greenLabel->setStyleSheet("background-color: gray;"); timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &TrafficLight::changeLight); timer->start(1000); } private: QLabel *redLabel; QLabel *yellowLabel; QLabel *greenLabel; QTimer *timer; int state = 0; void changeLight() { switch (state) { case 0: redLabel->setStyleSheet("background-color: red;"); yellowLabel->setStyleSheet("background-color: gray;"); greenLabel->setStyleSheet("background-color: gray;"); state = 1; timer->start(10000); break; case 1: redLabel->setStyleSheet("background-color: gray;"); yellowLabel->setStyleSheet("background-color: yellow;"); greenLabel->setStyleSheet("background-color: gray;"); state = 2; timer->start(3000); break; case 2: redLabel->setStyleSheet("background-color: gray;"); yellowLabel->setStyleSheet("background-color: gray;"); greenLabel->setStyleSheet("background-color: green;"); state = 3; timer->start(15000); break; case 3: redLabel->setStyleSheet("background-color: red;"); yellowLabel->setStyleSheet("background-color: gray;"); greenLabel->setStyleSheet("background-color: gray;"); state = 1; timer->start(10000); break; } } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); TrafficLight light; light.show(); return app.exec(); } ``` 运行上述代码,您将看到一个简单的LED交通灯示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大唐不良猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值