Минимальный пример который пришёл в голову:
main.cpp
#include <QtGui/QApplication>
#include "paintwidget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
PaintWidget w;
w.show();
return a.exec();
}
paintwidget.h
#ifndef PAINTWIDGET_H
#define PAINTWIDGET_H
#include <QtGui/QWidget>
#include <QtCore/QList>
#include <QtCore/QPoint>
class PaintWidget : public QWidget
{
Q_OBJECT
public:
PaintWidget(QWidget *parent = 0);
~PaintWidget();
protected:
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void paintEvent(QPaintEvent *event);
private:
QList<QPoint> mDrawBuffer;
bool mDrawMode;
};
#endif // PAINTWIDGET_H
paintwidget.cpp
#include "paintwidget.h"
#include <QtCore/QLine>
#include <QtGui/QPainter>
#include <QtGui/QMouseEvent>
PaintWidget::PaintWidget(QWidget *parent)
: QWidget(parent)
{
mDrawMode = false;
}
PaintWidget::~PaintWidget()
{
}
void PaintWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
mDrawMode = true;
mDrawBuffer.append(event->pos());
event->accept();
}
}
void PaintWidget::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
mDrawMode = false;
mDrawBuffer.append(event->pos());
this->update();
event->accept();
}
}
void PaintWidget::mouseMoveEvent(QMouseEvent *event)
{
if (!mDrawMode) return;
mDrawBuffer.append(event->pos());
this->update();
event->accept();
}
void PaintWidget::paintEvent(QPaintEvent *event)
{
if (mDrawBuffer.size()<2) return;
QPainter painter(this);
painter.setPen(Qt::green);
QList<QPoint>::const_iterator it = mDrawBuffer.begin();
QPoint start = *it;
it++;
while(it != mDrawBuffer.end()) {
QPoint end = *it;
painter.drawLine(start,end);
start = end;
it++;
}
}
Думаю из него можно понять идею как реализовать что-нибудь более сложное.