通过鼠标在窗口上点击形成多个点的连线,绘制一辆汽车沿着绘制的连线轨迹前进。要求连线点数大于20.可以通过清除按钮清除已经绘制的连线,并可以重新绘制一条轨迹连线。当车辆行驶到轨迹终点时,自动停止。(汽车实在可用方块代替)
首先思考:点是可以撤销的,所以我们需要一个数据结构去记录这些点,按顺序绘制,撤销时从数据结构中删除点即可。
这样我们在按下鼠标左键时的动作就很简单了,将具体的点记录到数据结构中。
- //鼠标信号处理
- 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();
- }
- }
需要一个定时器,当用户选择让小车跑起来时,动态更新小车的位置。
- 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));//设置画笔形式
- 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();
- }