C++(QT)画图行车

通过鼠标在窗口上点击形成多个点的连线,绘制一辆汽车沿着绘制的连线轨迹前进。要求连线点数大于20.可以通过清除按钮清除已经绘制的连线,并可以重新绘制一条轨迹连线。当车辆行驶到轨迹终点时,自动停止。(汽车实在可用方块代替)

首先思考:点是可以撤销的,所以我们需要一个数据结构去记录这些点,按顺序绘制,撤销时从数据结构中删除点即可。

这样我们在按下鼠标左键时的动作就很简单了,将具体的点记录到数据结构中。

cpp 复制代码
//鼠标信号处理
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();
    }
}

需要一个定时器,当用户选择让小车跑起来时,动态更新小车的位置。

cpp 复制代码
void MainWindow::on_timer()
{
    car_pos ++;
}

在paintEvent中具体的绘制线路以及小车

cpp 复制代码
//绘制信号处理
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();
}
相关推荐
TomCode先生2 分钟前
c#动态树形表达式详解
开发语言·c#
高-老师33 分钟前
基于R语言的物种气候生态位动态量化与分布特征模拟
开发语言·r语言·物种气候
大翻哥哥1 小时前
Python 2025:量化金融与智能交易的新纪元
开发语言·python·金融
weixin_437830942 小时前
使用冰狐智能辅助实现图形列表自动点击:OCR与HID技术详解
开发语言·javascript·ocr
疾风铸境2 小时前
qt+halcon开发相机拍照软件步骤
数码相机·qt·halcon·拍照
鹿鹿学长2 小时前
2025年全国大学生数学建模竞赛(C题) 建模解析|婴儿染色体数学建模|小鹿学长带队指引全代码文章与思路
c语言·开发语言·数学建模
zhousenshan2 小时前
Python爬虫常用框架
开发语言·爬虫·python
抠脚学代码3 小时前
Ubuntu Qt x64平台搭建 arm64 编译套件
数据库·qt·ubuntu
利刃大大3 小时前
【高并发内存池】五、页缓存的设计
c++·缓存·项目·内存池
DKPT3 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习