zoukankan      html  css  js  c++  java
  • QGraphicsView的paintEvent双缓存绘画

    MyGraphicsView.h

     1 #ifndef MYGRAPHICSVIEW_H
     2 #define MYGRAPHICSVIEW_H
     3 
     4 #include <QGraphicsView>
     5 #include <QMouseEvent>
     6 #include <QPaintEvent>
     7 #include <QKeyEvent>
     8 #include <QPainter>
     9 #include <QPixmap>
    10 #include <QDebug>
    11 
    12 class MyGraphicsView : public QGraphicsView
    13 {
    14     Q_OBJECT
    15 
    16 public:
    17     MyGraphicsView(QWidget *parent);
    18     ~MyGraphicsView();
    19 
    20 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);
    27 
    28 private:
    29     QPixmap pix;
    30     QPoint lasetPoint;
    31     QPoint endPoint;
    32     QPixmap tempPix;
    33     bool isDrawing;
    34     bool isDoubleClick;
    35 };
    36 
    37 #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);
    }

    三种绘制方法效果图:

  • 相关阅读:
    ros论坛
    python--dict和set类型--4
    python--条件判断和循环--3
    python--list和tuple类型--2
    Unicode与UTF-8互转(C语言实现)
    spring mvc 返回JSON数据
    值得学习的C语言开源项目和库
    mudos源码分析
    Freemarker使用总结
    Maven详解
  • 原文地址:https://www.cnblogs.com/Jace-Lee/p/6192573.html
Copyright © 2011-2022 走看看