Qt drawing board production code

 head File:

drawboard.h

#ifndef DRAWBOARD_H
#define DRAWBOARD_H

#include <QWidget>
#include <QPixMap>
#include <QPixmap>
#include <QMouseEvent>
#include <QPaintEvent>
#include <QComboBox>
#include <QLabel>
#include <QMainWindow>
#include <QDateTime>
#include <QFontComboBox>
#include <QPushButton>
#include <QToolButton>
#include <QComboBox>
#include <QTimer>
#include <QTextEdit>
#include <QDialog>
#include <QColorDialog>
#include <QDebug>
#include <QAction>
#include <QFileDialog>
#include <QMessageBox>
#include <QIODevice>
#include <QToolBar>

namespace Ui {
class DrawBoard;
}

class DrawBoard : public QWidget
{
    Q_OBJECT

public:
    explicit DrawBoard(QWidget *parent = 0);
    ~DrawBoard();

    QPoint start;
    QPoint end;
    QPixmap *pix;
    QPixmap *pix1;
    QString style = "曲线";
    QColor color = Qt::black;
    int width = 2;
    bool isEraser = false;

    void paintEvent(QPaintEvent *event);
    void mousePressEvent(QMouseEvent *event);
//    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

private:
    Ui::DrawBoard *ui;
};

#endif // DRAWBOARD_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

Source File:

drawboard.cpp

#include "drawboard.h"
#include "ui_drawboard.h"
#include <QPainter>

DrawBoard::DrawBoard(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::DrawBoard)
{
    ui->setupUi(this);

    //绘制的直线画再图片
    pix = new QPixmap(1600,1200);
    pix ->fill();
    pix1 = new QPixmap(1600,1200);
    pix1 ->fill();


}

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

void DrawBoard::paintEvent(QPaintEvent *event)
{
    //创建一个画家对象进行绘制,绘制控件为一条直线
    //
    QPainter p(this);
    //绘制静态直线
//    p.drawLine(QPoint(0,0),QPoint(300,300));
    //绘制动态直线
//    p.drawLine(start,end);
    //将画好直线的图片绘制到draw Board
    p.drawPixmap(QPoint(0,0),*pix);
}

void DrawBoard::mousePressEvent(QMouseEvent *event)
{
    start = event->pos();
    *pix1 = *pix;
}

void DrawBoard::mouseMoveEvent(QMouseEvent *event)
{
    end = event->pos();//获取鼠标释放时的坐标
    if(isEraser==true)
    {
        QPainter p(pix);
        p.setPen(QPen(QBrush(Qt::white),6));
        p.drawLine(start,end);
        start = end;
    }
    else
    {
        //当选中为曲线时,不需要进行pix替换
        if(style!="曲线")
        *pix = *pix1;

        //将直线绘制到图片上
        QPainter p(pix);

        //设置画笔的属性
        p.setPen(QPen(QBrush(color),width));

        if(style == "直线")
        {
            p.drawLine(start,end);
        }
        else if(style=="曲线")
        {
            p.drawLine(start,end);
            start = end;
        }
        else if(style=="矩形")
        {
            p.drawRect(QRect(start,end));
        }
        else if(style=="椭圆")
        {
            p.drawEllipse(QRect(start,end));
        }
    }
    update();//间接调用paintEvent方法
}

//void DrawBoard::mouseReleaseEvent(QMouseEvent *event)
//{
//    end = event->pos();//获取鼠标释放时的坐标
//    //将直线绘制到图片上
//    QPainter p(pix);
//    p.drawLine(start,end);
//    update();//间接调用paintEvent方法
//}

mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    DrawBoard* board = new DrawBoard();
    this->resize(1600,1200);
    this->setCentralWidget(board);

    DrawBoard *localDrawBoard = new DrawBoard();
    this->setCentralWidget(localDrawBoard);

    //画笔类型功能
    QComboBox *combo = new QComboBox();
    combo->addItem("直线");
    combo->addItem("曲线");
    combo->addItem("矩形");
    combo->addItem("椭圆");
    ui->mainToolBar->addWidget(new QLabel("绘制类型:"));
    ui->mainToolBar->addWidget(combo);

    connect(combo,QComboBox::currentTextChanged,[=](QString style){
        localDrawBoard->style = style;
    });

    //画笔宽度
    ui->mainToolBar->addWidget(new QLabel("画笔宽度:"));
     QComboBox *comboWidth = new QComboBox();
     int i = 1;
     while(i<=30)
     {
         comboWidth->addItem(QString::number(i));
         i++;
     }
    ui->mainToolBar->addWidget(comboWidth);
    connect(comboWidth,QComboBox::currentTextChanged,[=](QString width){
        localDrawBoard->width = width.toInt();
    });

    //画笔颜色
    QToolButton *localQToolButton = new QToolButton();
    localQToolButton->setText("颜色");
    ui->mainToolBar->addSeparator();
    ui->mainToolBar->addWidget(localQToolButton);

    connect(localQToolButton,QToolButton::clicked,[=](){
       QColor color = QColorDialog::getColor();

       //扩展:颜色按钮背景为选中的颜色
       localDrawBoard->color = color;
       localQToolButton->setStyleSheet(QString("background-color: rgb(%1,%2,%3);").arg(color.red()).arg(color.green()).arg(color.blue()));
    });


    //橡皮
    QToolButton *eraserBtn = new QToolButton();
    eraserBtn->setText("橡皮");
    eraserBtn->setCheckable(true);
    ui->mainToolBar->addSeparator();
    ui->mainToolBar->addWidget(eraserBtn);

    connect(eraserBtn,QToolButton::clicked,[=](bool checked){
        localDrawBoard->isEraser = checked;
    });

    //清屏
    QToolButton *clearBtn = new QToolButton();
    clearBtn->setText("清除");
    ui->mainToolBar->addSeparator();
    ui->mainToolBar->addWidget(clearBtn);

    connect(clearBtn,QToolButton::clicked,[=](){
        localDrawBoard->pix->fill();
        update();
    });

}

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

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

Guess you like

Origin blog.csdn.net/four_two_six_/article/details/130989292