Держи.
main.cpp
#include <QtGui/QApplication>
#include <QtGui/QWidget>
#include <QtGui/QGridLayout>
#include "gv.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget w; //виждет окна
gv *vid = new gv(); //наш графикс вью
QGridLayout gl; //простой лэйаут
gl.addWidget(vid);
w.setLayout(&gl);
w.show();
return a.exec();
}
gv.h
#ifndef GV_H
#define GV_H
#include <QtGui/QGraphicsView>
class gv : public QGraphicsView
{
Q_OBJECT
public:
gv(QWidget *parent = 0);
void mousePressEvent(QMouseEvent *event); //переопредиляем нужные эвенты
void mouseMoveEvent(QMouseEvent *event);
~gv();
};
#endif // GV_H
gv.cpp
#include "gv.h"
#include <QtGui/QGraphicsPathItem>
#include <QtGui/QGraphicsScene>
#include <QtGui/QPainterPath>
#include <QtGui/QPen>
#include <QtGui/QColor>
#include <QtGui/QMouseEvent>
#include <QtCore/QPointF>
// координаты мыша через mapToScene сохраняем
// в QPainterPath который толкаем в QGraphicsPathItem
// который создан QGraphicsScene которая подключена к
// нашему class gv : public QGraphicsView
QGraphicsPathItem * pi;
QPainterPath * pp;
gv::gv(QWidget *parent)
: QGraphicsView(parent)
{
pp = new QPainterPath();
QGraphicsScene *scene = new QGraphicsScene(this);
scene->setSceneRect(-200, -200, 400, 400);
setScene(scene);
setRenderHint(QPainter::Antialiasing,true);
pi = scene->addPath(*pp,QPen(QColor(Qt::green),5));
}
gv::~gv()
{
delete pi;
delete pp;
}
void gv::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton){
pp->lineTo(event->posF());
pi->setPath(mapToScene(*pp));
}
}
void gv::mousePressEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton){//левый батон создает
pp->moveTo(event->posF()); //новый сегмент
}else if (event->buttons() & Qt::RightButton){
delete pp; // правый очищает
pp = new QPainterPath();
pi->setPath(mapToScene(*pp));
}
}