Qt实现画板绘制椭圆

⌚Time: 2023-07-11 13:08:01

👨‍💻Author: Jack Ge

Qt在窗体中绘图在paintEvent函数中进行,使用QPainter类进行窗体绘制

如果只是简单的在paintevent中向画布绘制椭圆,由于实时绘制的许多个椭圆重合在一起,就会出现下面的情况

你可以在每次绘制椭圆之前调用清空画布


myPix->fill(Qt::white);

但是又会出现下面的情况,无法保存之前绘制的图形

正确的方法是使用一块缓存画布,每次鼠标按下,将主要画布的内容拷贝到缓存画布,并且在移动鼠标时实时进行画布的重新拷贝和绘制,标签显示的是缓存画布的图像。当按键抬起,才将椭圆正式绘制在主要画布上。并显示主要画布的图像

包含的头文件


#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);

    }



}


效果