MyGraphicsView.h
1 #ifndef MYGRAPHICSVIEW_H2 #define MYGRAPHICSVIEW_H34 #include <QGraphicsView>5 #include <QMouseEvent>6 #include <QPaintEvent>7 #include <QKeyEvent>8 #include <QPainter>9 #include <QPixmap>10 #include <QDebug>1112 class MyGraphicsView : public QGraphicsView13 {14 Q_OBJECT1516 public:17 MyGraphicsView(QWidget *parent);18 ~MyGraphicsView();1920 protected:21 void mousePressEvent(QMouseEvent *event);22 void mouseDoubleClickEvent(QMouseEvent *event);23 void mouseMoveEvent(QMouseEvent *event);24 void mouseReleaseEvent(QMouseEvent *event);25 void paintEvent(QPaintEvent *event);26 void keyPressEvent(QKeyEvent *event);2728 private:29 QPixmap pix;30 QPoint lasetPoint;31 QPoint endPoint;32 QPixmap tempPix;33 bool isDrawing;34 bool isDoubleClick;35 };3637 #endif // MYGRAPHICSVIEW_H
MyGraphicsView.cpp
#include \"MyGraphicsView.h\"MyGraphicsView::MyGraphicsView(QWidget *parent): QGraphicsView(parent){pix = QPixmap(1024, 768);pix.fill(Qt::white);isDrawing = false;isDoubleClick = false;}MyGraphicsView::~MyGraphicsView(){}void MyGraphicsView::mousePressEvent(QMouseEvent *event){if (event->button() == Qt::LeftButton){lasetPoint = event->pos();isDrawing = true;isDoubleClick = false;}QGraphicsView::mousePressEvent(event);}void MyGraphicsView::mouseDoubleClickEvent(QMouseEvent *event){if (event->button() == Qt::LeftButton){isDoubleClick = true;}QGraphicsView::mouseDoubleClickEvent(event);}void MyGraphicsView::mouseMoveEvent(QMouseEvent *event){if (event->buttons() & Qt::LeftButton){if (!isDoubleClick){endPoint = event->pos();this->viewport()->update();}}QGraphicsView::mouseMoveEvent(event);}void MyGraphicsView::mouseReleaseEvent(QMouseEvent *event){if (event->button() == Qt::LeftButton){if (!isDoubleClick){endPoint = event->pos();isDrawing = false;this->viewport()->update();}}QGraphicsView::mouseReleaseEvent(event);}void MyGraphicsView::paintEvent(QPaintEvent *event){/// 直接在窗体上绘图,前1次画的矩形是不能保存住的// QPainter painter(this->viewport());// int x, y, w, h;// x = lasetPoint.x();// y = lasetPoint.y();// w = endPoint.x() - x;// h = endPoint.y() - y;// painter.drawRect(x, y, w, h);/// 直接在pix上绘图,前1次前2次前3次...画的都保存住了(鼠标每移动一点就会触发paintEvent函数而画一次),所以在pix上会呈现好多矩形// int x, y, w, h;// x = lasetPoint.x();// y = lasetPoint.y();// w = endPoint.x() - x;// h = endPoint.y() - y;// QPainter pp(&pix);// pp.drawRect(x, y, w, h);// QPainter painter(this->viewport());// painter.drawPixmap(0, 0, pix);/// 双缓冲绘图,原理是在拖动过程中先把原来的图形复制到tempPix里面并在tempPix里面画,我们此时看到的就是在tempPix里的图形。只在鼠标释放的时候才在pix绘一次。int x, y, w, h;x = lasetPoint.x();y = lasetPoint.y();w = endPoint.x() - x;h = endPoint.y() - y;QPainter painter(this->viewport());if (isDrawing){tempPix = pix;QPainter pp(&tempPix);pp.drawRect(x, y, w, h);painter.drawPixmap(0, 0, tempPix);}else{QPainter pp(&pix);pp.drawRect(x, y, w, h);painter.drawPixmap(0, 0, pix);}QGraphicsView::paintEvent(event);}void MyGraphicsView::keyPressEvent(QKeyEvent *event){QGraphicsView::keyPressEvent(event);}
三种绘制方法效果图:
转载于:https://www.cnblogs.com/Jace-Lee/p/6192573.html