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

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

1.最终效果

以下就是我设计出来的效果,没有录视频,就先这样了:
第七篇 Qt实现十字路口交通灯控制系统(六)第七篇 Qt实现十字路口交通灯控制系统(六)

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:
};

问题:
第七篇 Qt实现十字路口交通灯控制系统(六)这是因为没有结束掉线程,在相关地方添加关闭线程代码就好了:
我是在关闭事件中加的。

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

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

4.结语

凑合吧。

上一篇:(四)对话框QDialog 以及控件


下一篇:Splay入门