widget.h
- #ifndef WIDGET_H
- #define WIDGET_H
-
- #include
- #include
//点 - #include
//鼠标事件 - #include
//绘图事件 -
- 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
//画家 -
- 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);
- }
- }
-
结果
