自己的画图板功能很简单,实现鼠标左键画图,右键撤销最后的一笔. 效果如下图:

MyPainter


/*---------------MyPainter.h---------------*/
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>
#include <QMouseEvent>
#include <QPaintEvent>

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    void paintEvent(QPaintEvent *);
    void mousePressEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);

    QVector< QVector<QPoint> > _lines;

private:
    bool move;
};

#endif // WIDGET_H

/*---------------MyPainter.h---------------*/
/*---------------MyPainter.cpp---------------*/
#include "Widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{

    this->setStyleSheet("background-color:white;");

    move = false;
}

Widget::~Widget()
{

}

void Widget::paintEvent(QPaintEvent *)
{
    QPainter p(this);
    for(int i = 0; i < _lines.size(); ++i)
    {
        const QVector<QPoint>& line = _lines.at(i);
        for(int j=0; j < line.size()-1; ++j)
        {
            p.drawLine(line.at(j), line.at(j+1));
        }
    }

}

void Widget::mousePressEvent(QMouseEvent *ev)
{
    if(ev->button() == Qt::LeftButton)
    {
        QVector<QPoint> line;
        _lines.append(line);

        QVector<QPoint>& lastLine = _lines.last();
        lastLine.append(ev->pos());
    }

    if(ev->button() == Qt::RightButton)
    {
        move = true;
        if(_lines.size() != 0)
        {
            _lines.pop_back();
        }
        update();
    }

}

void Widget::mouseReleaseEvent(QMouseEvent *ev)
{

    if(ev->button() == Qt::LeftButton)
    {

        QVector<QPoint>& lastLine = _lines.last();
        lastLine.append(ev->pos());

    }

    if(ev->button() == Qt::RightButton)
    {
        move = false;
    }

}

void Widget::mouseMoveEvent(QMouseEvent *ev)
{

    if(_lines.size() > 0 &&  ( move == false ))
    {

        QVector<QPoint>& lastLine = _lines.last();
        lastLine.append(ev->pos());
        update();
    }

}

/*---------------MyPainter.cpp---------------*/

/*---------------main.cpp---------------*/
#include "Widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

/*---------------main.cpp---------------*/


备份地址: 【QPainter实现画图板原型