C++(QT)画图行车

通过鼠标在窗口上点击形成多个点的连线,绘制一辆汽车沿着绘制的连线轨迹前进。要求连线点数大于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();
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Qt绘制图形时,可以使用QPainter类来完成。如果需要在绘制图形时添加延时效果,可以通过使用Qt提供的延时函数QThread::msleep()来实现。 使用延时函数的方法是在绘制每个图形元素之后,调用一次延时函数,将延时的时间设置为适当的值。这样可以在绘制完一个图形元素后暂停一段时间,再继续绘制下一个图形元素,从而在绘制过程中产生延时效果。 下面是一个简单的示例代码,演示了如何使用Qt实现延时的绘图效果: ```cpp #include <QPainter> #include <QThread> void DelayedDrawing() { // 创建一个QImage对象作为绘制目标 QImage image(300, 300, QImage::Format_RGB32); image.fill(Qt::white); // 创建一个QPainter对象进行绘制 QPainter painter(&image); // 按照需求绘制图形元素 for (int i = 0; i < 5; i++) { // 绘制一个矩形 painter.drawRect(i * 10, i * 10, 100, 100); // 刷新画布,将绘制的内容显示出来 painter.end(); // 延时500毫秒 QThread::msleep(500); // 重新设置Painter对象的绘制目标 painter.begin(&image); // 清除前一次的绘制内容 painter.eraseRect(0, 0, 300, 300); } // 绘制完毕后,将最终结果显示出来 painter.end(); painter.begin(&image); painter.end(); // display the image... } ``` 以上代码通过在绘制每个矩形后延时500毫秒,从而在绘制过程中产生延时效果。可以根据实际需求调整延时的时间和绘制的图形元素,以达到想要的效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值