白塔網(wǎng)站建設(shè)宣傳方式
通過鼠標在窗口上點擊形成多個點的連線,繪制一輛汽車沿著繪制的連線軌跡前進。要求連線點數(shù)大于20.可以通過清除按鈕清除已經(jīng)繪制的連線,并可以重新繪制一條軌跡連線。當車輛行駛到軌跡終點時,自動停止。(汽車實在可用方塊代替)
首先思考:點是可以撤銷的,所以我們需要一個數(shù)據(jù)結(jié)構(gòu)去記錄這些點,按順序繪制,撤銷時從數(shù)據(jù)結(jié)構(gòu)中刪除點即可。
這樣我們在按下鼠標左鍵時的動作就很簡單了,將具體的點記錄到數(shù)據(jù)結(jié)構(gòu)中。
//鼠標信號處理
void MainWindow::mousePressEvent(QMouseEvent* m)
{//左鍵點擊加入點,右鍵點擊撤銷操作if(m->button() == Qt::LeftButton){QPoint p = m->pos();m_pointArray.push_back(p);update();} else if (m->button() == Qt::RightButton) {m_pointArray.pop_back();update();}
}
需要一個定時器,當用戶選擇讓小車跑起來時,動態(tài)更新小車的位置。
void MainWindow::on_timer()
{car_pos ++;
}
在paintEvent中具體的繪制線路以及小車
//繪制信號處理
void MainWindow::paintEvent(QPaintEvent *)
{QPainter painter(this);paintRoad(&painter);drawCar(&painter);
}//繪制地圖
void MainWindow::paintRoad(QPainter *painter)
{//QPainter painter(this);painter->setPen(QPen(Qt::blue,2, Qt::SolidLine, Qt::RoundCap));//設(shè)置畫筆形式for(int i = 0; i < m_pointArray.count(); i ++){if (i < 1){continue;}painter->drawLine(m_pointArray[i-1],m_pointArray[i]);}
}
//繪制小車
void MainWindow::drawCar(QPainter *painter)
{if(m_pointArray.count() == 0){return;}painter->setPen(QPen(Qt::red, 2, Qt::SolidLine, Qt::RoundCap));if (car_pos >= m_pointArray.count()){car_pos = m_pointArray.count() -1;}painter->drawRect(m_pointArray[car_pos].x() - Car_Radius,m_pointArray[car_pos].y() - Car_Radius,Car_Radius*2,Car_Radius*2);update();
}