利用QT实现简单的画板功能

目的

在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里面是不会把之前画的东西清除的,所以界面上就可以显示之前画的轨迹。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值