AI智能
改变未来

QGraphicsView的paintEvent双缓存绘画

 

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

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » QGraphicsView的paintEvent双缓存绘画