【QT】QT实现画板工具的制作

463 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、实现目的

使用QT实现画板工具的功能,并通过交叉编译器移植到ARM开发板上运行,通过该程序实现ARM板屏幕触摸功能的测试。

二、实验效果

在这里插入图片描述

三、实现思路

实现mouseMoveEvent鼠标移动事件当我们的鼠标发生移动的时候记录两个坐标值,一个为移动起始坐标,一个为移动后的坐标,然后调用update重新绘画我们的页面,在paintEvent绘画事件中我们使用QPainter绘画直线,因为鼠标移动事件是实时发生,所以新坐标和旧坐标的距离只会有一个点的差距,所以绘画的直线会被描述为一个像素为1X1的点,然后通过这些点就组成了链接的线。

代码

paint类

#include "paint.h"
#include <QDebug>
Paint::Paint(QObject *parent)
{
    Q_UNUSED(parent);
    //初始化标志位
    Move_flag=0;
    //创建空白图像
    image=new QImage (1000,1000,QImage::Format_ARGB32);

}
void Paint::mouseMoveEvent(QMouseEvent *e)
{
    //鼠标移动事件处理
    x=e->x();
    y=e->y();
    if(Move_flag==1)
    this->update();
    else
    {
        Move_flag=1;
        x_old=x;
        y_old=y;
    }
}

void Paint::mouseReleaseEvent(QMouseEvent *e)
{
    Q_UNUSED(e);
   //鼠标抬起时清除按下标志位
   Move_flag=0;
}

void Paint::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    //绘图事件处理
    QPainter painter(image);
    // 设置画笔颜色
    painter.setPen(QColor(0, 255, 0));
    // 绘制直线
//    qDebug() << x_old << y_old << x << y << endl;
    painter.drawLine(QPointF(x_old,y_old), QPointF(x, y));
    x_old=x;
    y_old=y;
    QPainter painter1(this);
    painter1.drawImage(0,0,*image);

}

#ifndef PAINT_H
#define PAINT_H

#include <QObject>
#include <QWidget>
#include <QPainter>
#include <QDebug>
#include <QMouseEvent>
class Paint : public QWidget
{
    Q_OBJECT
public:
    explicit Paint(QObject *parent = nullptr);

    QImage *temp;
    quint32 *pic;
    int Move_flag;
    int x,y;
    int x_old,y_old;
    QImage *image;
public slots:

protected:
        void paintEvent(QPaintEvent *event);
        void mouseMoveEvent(QMouseEvent *e);
        void mouseReleaseEvent(QMouseEvent *e);
signals:

};

#endif // PAINT_H

清楚绘画的思路,看了上面的代码可以知道,这里的QPainter绘画是绘画在一张image图上,这个时候我们只需要将这张图清除了也就达到了清楚绘画的功能,实现代码

   //清除图像数据
   quint32 *ptr;
   ptr=( quint32 *) ui->widget->image->bits();
   for(int i=0;i<1000*1000;i++)
   {
       ptr[i]=0;
   }
   //paint对象重新绘图
   ui->widget->update();

这里的使用方法是将mainwidget中的widget空间提升为我们创建的这个控件类,如下图 在这里插入图片描述 工程完成过后我们还需要在Linux主机上交叉编译然后上传到开发板上运行就可以实现ARM板触摸功能的测试了。

完整代码下载

百度云下载:pan.baidu.com/s/1aF7t-KUE… 提取码:95nn