第七篇 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度,会出现撞车的情况。
2.4.静态变量与静态函数
静态变量和静态函数可以一处声明,多处使用,和全局变量一样,但是面向对象讲究的就是封装性,是谁的就放在谁那里,而不是放在外面成为野孩子,所以才不建议使用extern。
3.bug
这个问题不知道要怎么解决,因为在每个线程应该结束时我都把车子删除了,但我想了想,觉得应该是很多个线程同时进行时,线程a要释放了,但是又没有完全释放,所以线程b用到线程a时,a又刚好释放了,就越界了:比如我用的是listAll保存车子,那么应该是在删除车子a时,车子b要求重绘,又刚好访问到车子a,所以就出现了越界访问,因为时间间隔是64毫秒,还是有点短的。
4.结语
凑合吧。