widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPoint> //点
#include <QMouseEvent> //鼠标事件
#include <QPaintEvent> //绘图事件
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
void mousePressEvent(QMouseEvent *event); //鼠标按下事件
void mouseMoveEvent(QMouseEvent *event); //鼠标移动事件
void mouseReleaseEvent(QMouseEvent *event); //鼠标松开事件
void paintEvent(QPaintEvent *event); //绘图事件
private:
bool toSave;
QPoint pStart,pEnd; //起点和终点
QPixmap *px; //缓冲的画布
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include <QPainter> //画家
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
setFixedSize(800,600);
px = new QPixmap(this->width(),this->height()); //与主窗口大小一致
px->fill(); //不填充
}
Widget::~Widget()
{
}
void Widget::mousePressEvent(QMouseEvent *event)
{
pStart = event->pos(); //起点
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
pEnd = event->pos(); //终点
toSave = false; //不保存
//触发绘图事件
this->update();
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
pEnd = event->pos(); //终点
toSave = true; //保存
this->update(); //触发绘图事件
}
void Widget::paintEvent(QPaintEvent *event)
{
if(toSave) //区别移动还是松开
{
//当用户松开鼠标,将这根线画到pixmap
//设定Pixmap作为画布
QPainter p_pixmap(px); //两个画家在两个不同的画布上作画
p_pixmap.drawLine(pStart,pEnd);
}
//让Widget成为画布
QPainter p(this);
//将之前保留的线画出来
p.drawPixmap(0,0,*px);
if(toSave == false)
{
//只有鼠标移动的时候,我们才画这根临时的线
p.drawLine(pStart,pEnd);
}
}
结果