Qt在窗体中绘图在paintEvent函数中进行,使用QPainter类进行窗体绘制
如果只是简单的在paintevent中向画布绘制椭圆,由于实时绘制的许多个椭圆重合在一起,就会出现下面的情况

你可以在每次绘制椭圆之前调用清空画布
但是又会出现下面的情况,无法保存之前绘制的图形

正确的方法是使用一块缓存画布,每次鼠标按下,将主要画布的内容拷贝到缓存画布,并且在移动鼠标时实时进行画布的重新拷贝和绘制,标签显示的是缓存画布的图像。当按键抬起,才将椭圆正式绘制在主要画布上。并显示主要画布的图像
包含的头文件
#include <QMainWindow>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QPen>
#include <QBrush>
#include <QPainter>
在窗体类里面,进行声明
void mousePressEvent(QMouseEvent *e);//鼠标按下事件
void mouseMoveEvent(QMouseEvent *e);//鼠标移动事件
void mouseReleaseEvent(QMouseEvent *e);//鼠标抬起事件
void paintEvent(QPaintEvent *e);//绘图事件
bool realDraw;//绘制标志
QPixmap *myPix;//画布
QPixmap *myPixbuf;//缓存画布
QPoint startPoint,endPoint;//起始和结束点
源文件中的实现代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPen>
#include <QBrush>
#include <QPainter>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
myPix = new QPixmap(ui->label->size());//将自定义的绘制版大小设置为画板大小
myPix->fill(Qt::white);//填充颜色白色
myPixbuf = new QPixmap(ui->label->size());//缓存画布分配空间
*myPixbuf = myPix->copy(myPix->rect());
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::mousePressEvent(QMouseEvent *e){
realDraw = false;//绘制标志否
*myPixbuf = myPix->copy(myPix->rect());//拷贝主画布的图像
startPoint = endPoint = ui->label->mapFromGlobal(e->globalPos());//绘制起始点
}
void MainWindow::mouseMoveEvent(QMouseEvent *e){
*myPixbuf = myPix->copy(myPix->rect());//拷贝主画布的图像
endPoint = ui->label->mapFromGlobal(e->globalPos());//鼠标移动,记录绘制结束点
}
void MainWindow::mouseReleaseEvent(QMouseEvent *e){
*myPixbuf = myPix->copy(myPix->rect());
endPoint = ui->label->mapFromGlobal(e->globalPos());
realDraw = true;//绘制标志是
repaint();//调用paintEvent强制绘制主画布
startPoint = endPoint;//结束绘制
}
void MainWindow::paintEvent(QPaintEvent *e){
QPen pen;//画笔
pen.setColor(QColor(255,255,0));
pen.setWidth(5);
QBrush brush;//画刷
brush.setColor(QColor(255,255,0));
brush.setStyle(Qt::SolidPattern);
if(realDraw){//主画布绘制
QPainter painter(myPix);
painter.setPen(pen);
painter.setBrush(brush);
painter.drawEllipse(startPoint.x(),startPoint.y(),endPoint.x()-startPoint.x(),endPoint.y()-startPoint.y());//绘制椭圆
ui->label->setPixmap(*myPix);//将图像显示在标签上
}else{//缓存画布绘制
QPainter painter(myPixbuf);
painter.setPen(pen);
painter.setBrush(brush);
painter.drawEllipse(startPoint.x(),startPoint.y(),endPoint.x()-startPoint.x(),endPoint.y()-startPoint.y());
ui->label->setPixmap(*myPixbuf);
}
}
效果
