本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、实现目的
使用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