Qt之旅—10 双缓冲绘图

1 基本知识

      但我们使用painter进行快速绘图时会看到类似图下 的情况

221906_YHu4_3768017.png

 双缓冲绘图技术 的原理 用两个画布进行绘图,一个用于显示,一个用于绘制,也就是将图画之后再显示

就可以避免上面的情况。

2 源码

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    isDrawing=false;
    //重设窗口大小
    resize(600,500);
    //设置画布大小
     pix=QPixmap(200,200);
pix.fill(Qt::white);

    isDrawing=false;
}

MainWindow::~MainWindow()
{
    delete ui;
}

void  MainWindow::paintEvent(QPaintEvent *){
int x,y,h,w;
  x=lastpoint.x();
  y=lastpoint.y();
  w=endtpoint.x()-x;
  h=endtpoint.y()-y;

  //绘图设备
  QPainter pait(this);
  if(isDrawing)
  {
      //将pix 复制到 tmpPix(补助画布)中 保存让以前 的画不消失
      tmpPix=pix;
      QPainter pp(&tmpPix);
      pp.drawRect(x,y,w,h);
      pait.drawPixmap(0,0,tmpPix);
  }
  else{

      QPainter  pp(&pix);
      pp.drawRect(x,y,w,h);
      pait.drawPixmap(0,0,pix);
  }

}

void  MainWindow::mousePressEvent(QMouseEvent *event){
    if(event->button()==Qt::LeftButton){
        lastpoint==event->pos();
        isDrawing=true;
        update();
    }
}

void  MainWindow::mouseReleaseEvent(QMouseEvent *event){
    if(event->button()==Qt::LeftButton)
    {

        endtpoint=event->pos();
        isDrawing=false;
        update();
    }
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{

    if(event->buttons()==Qt::LeftButton)
    {

        endtpoint=event->pos();
        update();
    }
}
 

Demo22 地址:https://gitee.com/codemaner/qt_learning_record/tree/master

转载于:https://my.oschina.net/u/3768017/blog/1822857

Published by

风君子

独自遨游何稽首 揭天掀地慰生平