Qt画板在窗体和标签上画线

⌚Time: 2023-07-11 15:06:14

👨‍💻Author: Jack Ge

在窗体设备上绘制图像使用QPainter类,在paintevent函数中进行绘制

方法一:使用容器储存鼠标移动的点,并且绘制出来


#ifndef MAINWINDOW_H

#define MAINWINDOW_H



#include <QMainWindow>

#include <QMouseEvent>

#include <QPaintEvent>

#include <QPainter>





namespace Ui {

class MainWindow;

}



class MainWindow : public QMainWindow

{

    Q_OBJECT



public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();

    void mousePressEvent(QMouseEvent *e);//鼠标按下事件

       void mouseMoveEvent(QMouseEvent *e);//鼠标移动事件

       void mouseReleaseEvent(QMouseEvent *e);//鼠标抬起事件

       void paintEvent(QPaintEvent *e);//绘图事件

       QVector<QPoint> vpoint;



private:

    Ui::MainWindow *ui;

};



#endif // MAINWINDOW_H


源文件


#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

}



MainWindow::~MainWindow()

{

    delete ui;

}

void MainWindow::mousePressEvent(QMouseEvent *e){



    vpoint.push_back( e->pos());

}

void MainWindow::mouseMoveEvent(QMouseEvent *e){



    vpoint.push_back( e->pos());//将路径点加入容器

    repaint();//强制窗体更新显示绘制点

}

void MainWindow::mouseReleaseEvent(QMouseEvent *e){

    QVector<QPoint>().swap(vpoint);//清空容器下次重新绘制线

}

void MainWindow::paintEvent(QPaintEvent *e){

        

        QPainter painter(this);

        //绘制线段

        for (int i = 0;i<vpoint.size()-1;i++){

              painter.drawLine(vpoint[i],vpoint[i+1]);

        }

}


由于是直接在窗体上绘图,只能绘制一条曲线,下一次绘制后窗体更新,旧线就消失了

方法二:在qpixmap上绘制线,并显示在窗体中

在鼠标事件函数中,使用e->globalPos函数和mapFromGlobal函数,可以获取全局坐标并将全局坐标转换成控件内相对坐标,进而在控件上绘制

设置一个起始点startpoint和一个终点endpoint,在每次鼠标移动时,实时更新两个点的位置并绘制线段。


#ifndef MAINWINDOW_H

#define MAINWINDOW_H



#include <QMainWindow>

#include <QMouseEvent>

#include <QPaintEvent>

#include <QPainter>





namespace Ui {

class MainWindow;

}



class MainWindow : public QMainWindow

{

    Q_OBJECT



public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();

    void mousePressEvent(QMouseEvent *e);//鼠标按下事件

       void mouseMoveEvent(QMouseEvent *e);//鼠标移动事件

       void mouseReleaseEvent(QMouseEvent *e);//鼠标抬起事件

       void paintEvent(QPaintEvent *e);//绘图事件

       QPixmap *myPix;//画布

       QPoint startPoint,endPoint;//起始和结束点



private:

    Ui::MainWindow *ui;

};



#endif // MAINWINDOW_H


源文件


#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    myPix = new QPixmap(ui->label->size());//将自定义的绘制版大小设置为画板大小

    myPix->fill(Qt::white);//填充颜色白色

}



MainWindow::~MainWindow()

{

    delete ui;

}

void MainWindow::mousePressEvent(QMouseEvent *e){

    startPoint = endPoint = ui->label->mapFromGlobal( e->globalPos());

}

void MainWindow::mouseMoveEvent(QMouseEvent *e){

    startPoint = endPoint;

    endPoint = ui->label->mapFromGlobal( e->globalPos());

}

void MainWindow::mouseReleaseEvent(QMouseEvent *e){

}

void MainWindow::paintEvent(QPaintEvent *e){



        QPainter painter(myPix);

        painter.drawLine(startPoint,endPoint);

        ui->label->setPixmap(*myPix);

}