目的
在ARM板上使用电容屏的时候觉得有时会有触摸不灵的情况,就特别想写一个程序来捕捉触摸的轨迹,看看捕捉到的轨迹和实际触摸的轨迹有什么区别
简单介绍一下
在本程序中,利用了qt的painter工具,这个东西还是比较好用的,下面直接来看代码吧!!!
类介绍
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
protected:
void mousePressEvent(QMouseEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void paintEvent(QPaintEvent *e);
private:
QImage m_image; //实际画图的地方
QPoint m_prevPoint;
QPoint m_curPoint;
};
可以看到,我们这里重写了4个函数,但是后面可以看到实际上mouseReleseEvent并不需要重载。其中主要是mouseMoveEvent和paintEvent函数要着重看看。
再来看看成员:
m_image: 这个是画布,主要就是在这上面进行画画,然后再将image画在界面上
m_prevPoint: 记录点用的,此为上一个点
m_nextPoint:记当前点
构造函数
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
m_prevPoint(QPoint(0, 0)), m_curPoint(QPoint(0, 0))
{
QColor backclolor = qRgb(255, 255, 255);
m_image = QImage(width(), height(), QImage::Format_RGB32); //将大小设置成和界面一样大,这样刷图就刚好刷完整个界面
m_image.fill(backclolor);
ui->setupUi(this);
}
主要对image进行初始化
mousePressEvent
void MainWindow::mousePressEvent(QMouseEvent *e)
{
m_prevPoint = e->pos();
}
按下时其实就只记录了一个点而已,这样在移动的时候才能有第一个点,我们在两个点之间画直线,这样画出来的轨迹才会连续。
mouseReleaseEvent
void MainWindow::mouseReleaseEvent(QMouseEvent *)
{
//do nothing
}
mouseMoveEvent
void MainWindow::mouseMoveEvent(QMouseEvent *e)
{
m_curPoint = e->pos();
QPainter painter(&m_image);
QPen pen;
pen.setColor(Qt::red);
pen.setWidth(2);
painter.setPen(pen);
painter.drawLine(m_prevPoint, m_curPoint);
update();
m_prevPoint = m_curPoint;
}
这里我们在m_image上进行画画,就是把坐标传进去,然后画一条直线。
注意:这里我们在画完了过后必须要调用 update(),因为这样才能调用paintEvent(),才会对界面进行刷新。
paintEvent
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawImage(0, 0, m_image);
}
就是将m_image在界面上画出来
注意有坑
之前我的设想在paintEvent里面直接将两个点画出来,但是这样是达不到效果的,因为每调一次update(),都会重新来画界面,这样你在界面上始终就只有两个点的图形,而我们moveMouseEvent的移动距离又比较短,所以界面上根本就看不出来画了东西。
而我们把画的点画进image里面,image里面是不会把之前画的东西清除的,所以界面上就可以显示之前画的轨迹。