1.最后一个类地图类(界面)Map
1.1.宏常量
主要用于画图时设置的数据。
#define mainGrassWidth 270
#define mianGrassHeight 170
#define vertilGrassWidth 40
#define vertilGrassHeight 170
#define transverseGrassWidth 270
#define transverseGrassHeight 40
#define middleAreaWidth 260
#define middleAreaHeight 260
#define lineDistance 30
1.2.属性
(1)静态变量:灯
static Lamp elampLeft,elampMiddle,elampRight;//东三灯
static Lamp wlampLeft,wlampMiddle,wlampRight;//西三灯 static Lamp slampLeft,slampMiddle,slampRight;//南三灯
static Lamp nlampLeft,nlampMiddle,nlampRight;//北三灯
(2)车辆存储
static QVector<Car*> listAll;
//南三路
static QVector<Car*> listS2W;
static QVector<Car*> listS2N;
static QVector<Car*> listS2E;
//北三路
static QVector<Car*> listN2E;
static QVector<Car*> listN2S;
static QVector<Car*> listN2W;
//东三路
static QVector<Car*> listE2S;
static QVector<Car*> listE2W;
static QVector<Car*> listE2N;
//西三路
static QVector<Car*> listW2N;
static QVector<Car*> listW2E;
static QVector<Car*> listW2S;
(3)控制变量
LampControl control;//灯控制
ControlCar controlcar;//控制车
(4)路名集合,图片集合
static QString road[12];//路名集合
static QString car_img[4][2];//车子图片集合
(5)画画事件
QPainter *paint;//画画
(6)车
Car *car;
1.3.操作
*(1)explicit Map(QWidget parent = 0);
设置窗口大小,建立信号与槽的联系,启动相关线程。
*(2)void closeEvent(QCloseEvent );
关闭事件,关闭相关线程。
(3)void initLamp();
初始化灯。
*(4)void paintEvent(QPaintEvent );//画画事件
画画事件,画线条,图形。
*(5)void drawGrass(QPainter );//画草地
*(6)void drawLine(QPainter );//画线
*(7)void drawEWLine(QPainter );//画东西线
*(8)void drawSNLine(QPainter );//画南北线
*(9)void drawYellow(QPainter );//画黄线
*(10)void drawCrosswalk(QPainter );//画斑马线
*(11)void drawLamp(QPainter );//画灯
*(12)void drawEllipse(QPainter paint,Lamp lamp);//画圆
*(13)void drawLabel(QPainter );//画方向标识
*(14)void drawCar(QPainter );//画车
*(15)void drawTimeboard(QPainter );//画计时板
1.4.槽
(1)void updatemyself();
重绘窗口。
(2)void changeLamp(QString group,QString location,bool status);
改变灯的状态。
(3)void createCar();
创建车辆。
1.5.头文件
#ifndef MAP_H
#define MAP_H
#include <QWidget>
#include "lamp.h"
#include "lampcontrol.h"
#include <QPainter>
#include <QCloseEvent>
#include "controlcar.h"
#include <QVector>
#include "car.h"
#define mainGrassWidth 270
#define mianGrassHeight 170
#define vertilGrassWidth 40
#define vertilGrassHeight 170
#define transverseGrassWidth 270
#define transverseGrassHeight 40
#define middleAreaWidth 260
#define middleAreaHeight 260
#define lineDistance 30
namespace Ui {
class Map;
}
class Map : public QWidget
{
Q_OBJECT
public:
explicit Map(QWidget *parent = 0);
~Map();
public slots:
void updatemyself();
void changeLamp(QString group,QString location,bool status);
void createCar();
public:
static Lamp elampLeft,elampMiddle,elampRight;//东三灯
static Lamp wlampLeft,wlampMiddle,wlampRight;//西三灯
static Lamp slampLeft,slampMiddle,slampRight;//南三灯
static Lamp nlampLeft,nlampMiddle,nlampRight;//北三灯
LampControl control;//灯控制
ControlCar controlcar;//控制车
static QString road[12];//路名集合
static QString car_img[4][2];//车子图片集合
QPainter *paint;//画画
public:
static QVector<Car*> listAll;
//南三路
static QVector<Car*> listS2W;
static QVector<Car*> listS2N;
static QVector<Car*> listS2E;
//北三路
static QVector<Car*> listN2E;
static QVector<Car*> listN2S;
static QVector<Car*> listN2W;
//东三路
static QVector<Car*> listE2S;
static QVector<Car*> listE2W;
static QVector<Car*> listE2N;
//西三路
static QVector<Car*> listW2N;
static QVector<Car*> listW2E;
static QVector<Car*> listW2S;
private:
Ui::Map *ui;
void closeEvent(QCloseEvent *);
void initLamp();
void paintEvent(QPaintEvent *);//画画事件
void drawGrass(QPainter *);//画草地
void drawLine(QPainter *);//画线
void drawEWLine(QPainter *);//画东西线
void drawSNLine(QPainter *);//画南北线
void drawYellow(QPainter *);//画黄线
void drawCrosswalk(QPainter *);//画斑马线
void drawLamp(QPainter *);//画灯
void drawEllipse(QPainter *paint,Lamp lamp);//画圆
void drawLabel(QPainter *);//画方向标识
void drawCar(QPainter *);//画车
void drawTimeboard(QPainter *);//画计时板
Car *car;
};
#endif // MAP_H
1.6.源文件
#include "map.h"
#include "ui_map.h"
#include <QMatrix>
QString Map::road[12] = {"S2W","S2N","S2E","N2E","N2S","N2W","E2S","E2W","E2N","W2N","W2E","W2S"};//路
QString Map::car_img[4][2] = {{":/new/picture/S2N.png",":/new/picture/S2N2.png"}
,{":/new/picture/N2S.png",":/new/picture/N2S2.png"}
,{":/new/picture/E2W.png",":/new/picture/E2W2.png"}
,{":/new/picture/W2E.png",":/new/picture/W2E2.png"}};//车辆图片
QVector<Car*> Map::listAll;
QVector<Car*> Map::listS2W;
QVector<Car*> Map::listS2N;
QVector<Car*> Map::listS2E;
QVector<Car*> Map::listN2E;
QVector<Car*> Map::listN2S;
QVector<Car*> Map::listN2W;
QVector<Car*> Map::listE2S;
QVector<Car*> Map::listE2W;
QVector<Car*> Map::listE2N;
QVector<Car*> Map::listW2N;
QVector<Car*> Map::listW2E;
QVector<Car*> Map::listW2S;
Lamp Map::elampLeft,Map::elampMiddle,Map::elampRight;//东三灯
Lamp Map::wlampLeft,Map::wlampMiddle,Map::wlampRight;//西三灯
Lamp Map::slampLeft,Map::slampMiddle,Map::slampRight;//南三灯
Lamp Map::nlampLeft,Map::nlampMiddle,Map::nlampRight;//北三灯
Map::Map(QWidget *parent) :
QWidget(parent),
ui(new Ui::Map)
{
ui->setupUi(this);
this->setWindowTitle("十字路口交通灯控制系统");
this->setMaximumSize(800,600);this->setMinimumSize(800,600);
initLamp();
QObject::connect(&control,SIGNAL(updateMain()),this,SLOT(update()));
QObject::connect(&control,SIGNAL(lampChange(QString,QString,bool)),this
,SLOT(changeLamp(QString,QString,bool)));
QObject::connect(&controlcar,SIGNAL(create()),this,SLOT(createCar()));
control.moveToThread(&control);
control.start();
controlcar.moveToThread(&controlcar);
controlcar.start();
}
void Map::initLamp(){
int elampLMR_x = 480;
int elampLeft_y = 320,elampMiddle_y = 350,elampRight_y = 380;
int wlampLMR_x = 295;
int wlampLeft_y = 255,wlampMiddle_y = 225,wlampRight_y = 195;
int slampLMR_y = 380;
int slampLeft_x = 355,slampMiddle_x = 325,slampRight_x = 295;
int nlampLMR_y = 195;
int nlampLeft_x = 420,nlampMiddle_x = 450,nlampRight_x = 480;
elampLeft.setInfo(elampLMR_x,elampLeft_y,false);
elampMiddle.setInfo(elampLMR_x,elampMiddle_y,false);
elampRight.setInfo(elampLMR_x,elampRight_y,true);
wlampLeft.setInfo(wlampLMR_x,wlampLeft_y,false);
wlampMiddle.setInfo(wlampLMR_x,wlampMiddle_y,false);
wlampRight.setInfo(wlampLMR_x,wlampRight_y,true);
slampLeft.setInfo(slampLeft_x,slampLMR_y,false);
slampMiddle.setInfo(slampMiddle_x,slampLMR_y,false);
slampRight.setInfo(slampRight_x,slampLMR_y,true);
nlampLeft.setInfo(nlampLeft_x,nlampLMR_y,false);
nlampMiddle.setInfo(nlampMiddle_x,nlampLMR_y,false);
nlampRight.setInfo(nlampRight_x,nlampLMR_y,true);
}
void Map::paintEvent(QPaintEvent *){
this->paint = new QPainter;
this->paint->begin(this);
this->drawGrass(this->paint);//画草地
this->drawLine(this->paint);//画线
this->drawLamp(this->paint);//画灯
this->drawLabel(this->paint);//画路线标志
this->drawCar(paint);
this->paint->end();
}
void Map::drawGrass(QPainter *paint){
QColor *color = new QColor(14,84,12);//草地颜色
int grass1_x = 0,grass1_y = 0;//第一块草地坐标
int grass2_x = 0,grass2_y = 430;//第二块草地坐标
int grass3_x = 530,grass3_y = 0;//第三块草地坐标
int grass4_x = 530,grass4_y = 430;//第四块草地坐标
int grass5_x = 0,grass5_y = 280;//第五块草地坐标
int grass6_x = 530,grass6_y = 280;//第六块草地坐标
int grass7_x = 380,grass7_y = 0;//第七块草地坐标
int grass8_x = 380,grass8_y = 430;//第八块草地坐标
paint->fillRect(grass1_x,grass1_y,mainGrassWidth,mianGrassHeight,*color);
paint->fillRect(grass2_x,grass2_y,mainGrassWidth,mianGrassHeight,*color);
paint->fillRect(grass3_x,grass3_y,mainGrassWidth,mianGrassHeight,*color);
paint->fillRect(grass4_x,grass4_y,mainGrassWidth,mianGrassHeight,*color);
paint->fillRect(grass5_x,grass5_y,transverseGrassWidth,transverseGrassHeight,*color);
paint->fillRect(grass6_x,grass6_y,transverseGrassWidth,transverseGrassHeight,*color);
paint->fillRect(grass7_x,grass7_y,vertilGrassWidth,vertilGrassHeight,*color);
paint->fillRect(grass8_x,grass8_y,vertilGrassWidth,vertilGrassHeight,*color);
delete color;
}
void Map::drawLine(QPainter *paint){
this->drawEWLine(paint);
this->drawSNLine(paint);
this->drawCrosswalk(paint);
this->drawYellow(paint);
int middleFrame_x = 270,middleFrame_y = 170;
paint->setPen(Qt::white);
paint->drawRect(middleFrame_x + 20,middleFrame_y + 20,middleAreaWidth - 40,middleAreaHeight - 40);
paint->setPen(Qt::yellow);
paint->drawRect(middleFrame_x,middleFrame_y,middleAreaWidth,middleAreaHeight);
}
void Map::drawEWLine(QPainter *paint){
paint->setPen(Qt::white);
int elinestar_x = 510,elineterminal_x = 800;
int wlinestar_x = 0,wlineterminal_x = 290;
int line1_y = 220,line2_y = 250;
int line3_y = 350,line4_y = 380;
paint->drawLine(elinestar_x,line1_y,elineterminal_x,line1_y);
paint->drawLine(elinestar_x,line2_y,elineterminal_x,line2_y);
paint->drawLine(elinestar_x,line3_y,elineterminal_x,line3_y);
paint->drawLine(elinestar_x,line4_y,elineterminal_x,line4_y);
paint->drawLine(wlinestar_x,line1_y,wlineterminal_x,line1_y);
paint->drawLine(wlinestar_x,line2_y,wlineterminal_x,line2_y);
paint->drawLine(wlinestar_x,line3_y,wlineterminal_x,line3_y);
paint->drawLine(wlinestar_x,line4_y,wlineterminal_x,line4_y);
}
void Map::drawSNLine(QPainter *paint){
paint->setPen(Qt::white);
int slinestar_y = 410,slineterminal_y = 600;
int nlinestar_y = 0,nlineterminal_y = 190;
int line1_x = 320,line2_x = 350;
int line3_x = 450,line4_x = 480;
paint->drawLine(line1_x,slinestar_y,line1_x,slineterminal_y);
paint->drawLine(line2_x,slinestar_y,line2_x,slineterminal_y);
paint->drawLine(line3_x,slinestar_y,line3_x,slineterminal_y);
paint->drawLine(line4_x,slinestar_y,line4_x,slineterminal_y);
paint->drawLine(line1_x,nlinestar_y,line1_x,nlineterminal_y);
paint->drawLine(line2_x,nlinestar_y,line2_x,nlineterminal_y);
paint->drawLine(line3_x,nlinestar_y,line3_x,nlineterminal_y);
paint->drawLine(line4_x,nlinestar_y,line4_x,nlineterminal_y);
}
void Map::drawYellow(QPainter *paint){
paint->setPen(Qt::yellow);
int eline_x = 510,wline_x = 290;
int ewline1_y = 0,ewline2_y = 600;
int sline_y = 410,nline_y = 190;
int snline1_x = 0,snline2_x = 800;
paint->drawLine(eline_x,ewline1_y,eline_x,ewline2_y);//东黄线
paint->drawLine(wline_x,ewline1_y,wline_x,ewline2_y);//西黄线
paint->drawLine(snline1_x,sline_y,snline2_x,sline_y);//北黄线
paint->drawLine(snline1_x,nline_y,snline2_x,nline_y);//南黄线
}
void Map::drawCrosswalk(QPainter *paint){
paint->setPen(Qt::white);
int distance = 10;
int snstartline_x = 0,snendline_x = 800;
int nline1_y = 170,nline2_y = 190;
int sline1_y = 410,sline2_y = 430;
int ewstartline_y = 0,ewendline_y = 600;
int eline1_x = 510,eline2_x = 530;
int wline1_x = 270,wline2_x = 290;
for(int x = snstartline_x;x <= snendline_x;x += distance){
paint->drawLine(x,nline1_y,x,nline2_y);
paint->drawLine(x,sline1_y,x,sline2_y);
}
for(int y = ewstartline_y;y <= ewendline_y;y += distance){
paint->drawLine(eline1_x,y,eline2_x,y);
paint->drawLine(wline1_x,y,wline2_x,y);
}
}
void Map::drawLamp(QPainter *paint){
paint->setPen(QPen(Qt::black,5));
this->drawEllipse(paint,elampLeft);
this->drawEllipse(paint,elampMiddle);
this->drawEllipse(paint,elampRight);
this->drawEllipse(paint,wlampLeft);
this->drawEllipse(paint,wlampMiddle);
this->drawEllipse(paint,wlampRight);
this->drawEllipse(paint,slampLeft);
this->drawEllipse(paint,slampMiddle);
this->drawEllipse(paint,slampRight);
this->drawEllipse(paint,nlampLeft);
this->drawEllipse(paint,nlampMiddle);
this->drawEllipse(paint,nlampRight);
this->drawTimeboard(paint);
}
void Map::drawEllipse(QPainter *paint,Lamp lamp){
if(lamp.getStatus()){
paint->setBrush(QBrush(Qt::green,Qt::SolidPattern));
paint->drawEllipse(400-20,300-20,40,40);
}
else{
paint->setBrush(QBrush(Qt::red,Qt::SolidPattern));
}
paint->drawEllipse(lamp.getX(),lamp.getY(),Lamp::getWidth(),Lamp::getHeight());
}
void Map::drawLabel(QPainter *paint){
int labelwidth = 30,labelheight = 30;
int elabel_x = 540,eright_y = 190,emiddle_y = 220,eleft_y = 250;
int wlabel_x = 230,wright_y = 320,wmiddle_y = 350,wleft_y = 380;
int slabel_y = 440,sright_x = 420,smiddle_x = 450,sleft_x = 480;
int nlabel_y = 130,nright_x = 290,nmiddle_x = 320,nleft_x = 350;
//1南,2东,3北,4西
paint->drawPixmap(elabel_x,eright_y,labelwidth,labelheight,QPixmap(":/new/picture/2.3.png"));
paint->drawPixmap(elabel_x,emiddle_y,labelwidth,labelheight,QPixmap(":/new/picture/2.2.png"));
paint->drawPixmap(elabel_x,eleft_y,labelwidth,labelheight,QPixmap(":/new/picture/2.1.png"));
paint->drawPixmap(wlabel_x,wright_y,labelwidth,labelheight,QPixmap(":/new/picture/4.1.png"));
paint->drawPixmap(wlabel_x,wmiddle_y,labelwidth,labelheight,QPixmap(":/new/picture/4.2.png"));
paint->drawPixmap(wlabel_x,wleft_y,labelwidth,labelheight,QPixmap(":/new/picture/4.3.png"));
paint->drawPixmap(sright_x,slabel_y,labelwidth,labelheight,QPixmap(":/new/picture/1.1.png"));
paint->drawPixmap(smiddle_x,slabel_y,labelwidth,labelheight,QPixmap(":/new/picture/1.2.png"));
paint->drawPixmap(sleft_x,slabel_y,labelwidth,labelheight,QPixmap(":/new/picture/1.3.png"));
paint->drawPixmap(nright_x,nlabel_y,labelwidth,labelheight,QPixmap(":/new/picture/3.3.png"));
paint->drawPixmap(nmiddle_x,nlabel_y,labelwidth,labelheight,QPixmap(":/new/picture/3.2.png"));
paint->drawPixmap(nleft_x,nlabel_y,labelwidth,labelheight,QPixmap(":/new/picture/3.1.png"));
}
void Map::drawCar(QPainter *paint){
QMatrix matrix;
for(int i = 0;i < listAll.size();i++){
if(listAll.at(i)->isTurnLeft()){
matrix.rotate(-90);
paint->drawPixmap(listAll.at(i)->getStart_x()+ listAll.at(i)->getTurnline_x()
,listAll.at(i)->getStart_y() + listAll.at(i)->getTurnline_y()
,listAll.at(i)->getcarWidth(),listAll.at(i)->getcarHeight(),
QPixmap(listAll.at(i)->getcarImg()).transformed(matrix,Qt::SmoothTransformation));
}
else if(listAll.at(i)->isTurnRight()){
matrix.rotate(90);
paint->drawPixmap(listAll.at(i)->getStart_x(),listAll.at(i)->getStart_y(),
listAll.at(i)->getcarWidth(),listAll.at(i)->getcarHeight(),
QPixmap(listAll.at(i)->getcarImg()).transformed(matrix,Qt::SmoothTransformation));
}
else{
paint->drawPixmap(listAll.at(i)->getStart_x(),listAll.at(i)->getStart_y(),
listAll.at(i)->getcarWidth(),listAll.at(i)->getcarHeight(),
QPixmap(listAll.at(i)->getcarImg()));
}
}
}
void Map::drawTimeboard(QPainter *paint){
paint->setPen(Qt::red);
int size = 20,linewidth = 5;
paint->setFont(QFont("行楷",size,linewidth));
int boardwidth = 30,boardheamp = 30;
int eboard_x = 480,eboard_y = 285;
int wboard_x = 290,wboard_y = 285;
int sboard_x = 385,sboard_y = 380;
int nboard_x = 385,nboard_y = 190;
paint->fillRect(eboard_x,eboard_y,boardwidth,boardheamp,Qt::black);
paint->drawText(eboard_x,eboard_y+25,QString::number(this->control.getEWtime()));
paint->fillRect(wboard_x,wboard_y,boardwidth,boardheamp,Qt::black);
paint->drawText(wboard_x,wboard_y+25,QString::number(this->control.getEWtime()));
paint->fillRect(sboard_x,sboard_y,boardwidth,boardheamp,Qt::black);
paint->drawText(sboard_x,sboard_y+25,QString::number(this->control.getSNtime()));
paint->fillRect(nboard_x,nboard_y,boardwidth,boardheamp,Qt::black);
paint->drawText(nboard_x,nboard_y+25,QString::number(this->control.getSNtime()));
}
void Map::updatemyself(){
this->update();
}
void Map::changeLamp(QString group,QString location,bool status){
if(group == "NS"){
if(location == "middle"){
this->slampMiddle.setStatus(status);
this->nlampMiddle.setStatus(status);
}
else if(location == "left"){
this->slampLeft.setStatus(status);
this->nlampLeft.setStatus(status);
}
}
else if(group == "WE"){
if(location == "middle"){
this->wlampMiddle.setStatus(status);
this->elampMiddle.setStatus(status);
}
else if(location == "left"){
this->wlampLeft.setStatus(status);
this->elampLeft.setStatus(status);
}
}
}
void Map::createCar(){
car = new Car;
QObject::connect(car,SIGNAL(updateMain()),this,SLOT(updatemyself()));
listAll.append(car);
car->moveToThread(car);
car->start();
QByteArray ba = car->getRoadName().toLatin1();
char *direction = ba.data();
switch(direction[0]){
case 'S':
switch (direction[2]){
case 'W':
listS2W.append(car);break;
case 'N':
listS2N.append(car);break;
case 'E':
listS2E.append(car);break;
}
break;
case 'N':
switch (direction[2]){
case 'W':
listN2W.append(car);break;
case 'S':
listN2S.append(car);break;
case 'E':
listN2E.append(car);break;
}
break;
case 'E':
switch (direction[2]){
case 'W':
listE2W.append(car);break;
case 'N':
listE2N.append(car);break;
case 'S':
listE2S.append(car);break;
}
break;
case 'W':
switch (direction[2]){
case 'S':
listW2S.append(car);break;
case 'N':
listW2N.append(car);break;
case 'E':
listW2E.append(car);break;
}
break;
}
delete direction;
}
void Map::closeEvent(QCloseEvent *){
control.terminate();
controlcar.terminate();
car->terminate();
for(int i = 0;i < listAll.size();i++){
listAll.at(i)->terminate();
}
}
Map::~Map()
{
delete ui;
}
2.结语
退出时,要退出线程,不然会提示线程任然在运行。