QT learning day 6: drawing board production (to achieve the function of drawing images and erasers on the pictures)

Project name: XPS
compilation tool: VS2017

Effect picture

Edit function:
Insert picture description here
save function

Insert picture description here

Header file 1: ximage.h code

#pragma once

#include <QWidget>
#include<QPen>
class XImage : public QWidget
{
    
    
	Q_OBJECT

public:
	XImage(QWidget *parent = 0);
	~XImage();

	void paintEvent(QPaintEvent * ev);
	void mouseMoveEvent(QMouseEvent *ev);
	void mouseReleaseEvent(QMouseEvent *ev)
	{
    
    
		mpos = QPoint();
	}
public slots:
	void Open();
	void SetPen(int size, QColor col);
	void SetEraser(int size);
	void Save();
protected:
	//原图
	QImage src;
	//输出图像
	QImage out;
	//上一次的鼠标位置
	QPoint mpos;
	QPen pen;
};

xps.h code

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_xps.h"
enum XSTATUS
{
    
    
	XPEN,
	XERASER
};
class XPS : public QMainWindow
{
    
    
    Q_OBJECT

public:
	XSTATUS status = XPEN;
    XPS(QWidget *parent = Q_NULLPTR);
public slots:
	void SetEraser();
	void SetPen();
	void SetColor();
	void Save();
private:
	QColor col;
    Ui::XPSClass ui;
};

main.cpp code

#include "xps.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    
    
    QApplication a(argc, argv);
    XPS w;
    w.show();
	w.setWindowTitle(QStringLiteral( "往事随风牌画盘"));
    return a.exec();
}

ximage.cpp code

#include "ximage.h"
#include <QPainter>
#include <QFileDialog>
#include <QMouseEvent>
#include <QPen>
XImage::XImage(QWidget *parent)
	: QWidget(parent)
{
    
    
}

XImage::~XImage()
{
    
    
}
void XImage::Open()
{
    
    
	//打开图像  用户选择图片
	QString filename = QFileDialog::getOpenFileName(this, QStringLiteral("打开图片"), "",
		QStringLiteral("支持格式(*.png *.jpg *.bmp)"));
	if (filename.isEmpty())return;
	if(!src.load(filename))return;
	resize(src.size());
	mpos = QPoint();
	out = src.copy();
	update();
}
void XImage::paintEvent(QPaintEvent *ev)
{
    
    
	QPainter p(this);
	if (!out.isNull())
		p.drawImage(0, 0, out);

}

void XImage::SetPen(int size, QColor col)
{
    
    
	
	pen.setWidth(size);
	pen.setBrush(Qt::red);
	pen.setCapStyle(Qt::RoundCap);
	pen.setJoinStyle(Qt::RoundJoin);
}
//橡皮擦
void XImage::SetEraser(int size)
{
    
    
	pen.setWidth(size);
	pen.setBrush(QBrush(src));
}
void XImage::Save()
{
    
    
	if (out.isNull())return;
	QString filename=QFileDialog::getSaveFileName(this, QStringLiteral("保存文件"), ""
		, QStringLiteral("支持格式(*.png *.jpg *.bmp)"));
	if (filename.isNull())return;
	if (!out.save(filename))return;
}
void XImage::mouseMoveEvent(QMouseEvent * ev)
{
    
    
	//绘制到原图中
	if (out.isNull())return;
	QPainter p(&out);
	
	//开启抗锯齿
	p.setRenderHint(QPainter::Antialiasing);
	p.setPen(pen);
	if (mpos.isNull())mpos = ev->pos();
	p.drawLine(QLine(mpos, ev->pos()));
	mpos = ev->pos();
	update();
}

xps.cpp code

#include "xps.h"
#include<QColorDialog>
#include<QButtonGroup>
XPS::XPS(QWidget *parent)
    : QMainWindow(parent)
{
    
    
    ui.setupUi(this);
	//打开图片
	connect(ui.openaction, SIGNAL(triggered()), ui.image, SLOT(Open()));
	//保存图片
	connect(ui.saveaction, SIGNAL(triggered()), ui.image, SLOT(Save()));
	col = QColor(200, 0, 0, 255);
	SetPen();
	//画笔和橡皮按钮排他选择
	QButtonGroup *gp = new QButtonGroup(this);
	gp->addButton(ui.eraseButton);
	gp->addButton(ui.penButton);
	gp->setExclusive(true);
}
void XPS::SetPen()
{
    
    
	ui.image->SetPen(ui.penSize->value(), col);
	status = XPEN;
	ui.penButton->setCheckable(true);
}


void XPS::SetEraser()
{
    
    
	ui.image->SetEraser(ui.penSize->value());
	status = XERASER;
	ui.eraseButton->setCheckable(true);
}
void XPS::SetColor()
{
    
    
	col=QColorDialog::getColor(Qt::red, this);
	
	QString sty = QString("background-color:rgba(%1,%2,%3,%4)")
		.arg(col.red()).arg(col.green()).arg(col.blue()).arg(col.alpha());
	ui.colorButton->setStyleSheet(sty);
	
	SetPen();
}

void XPS::Save()
{
    
    
	ui.image->Save();
	ui.statusBar->showMessage(QStringLiteral("保存成功,5s后自动关闭"),5000);
}


ui file

(It is not easy to describe, it has been packaged in the source code)

Source file compression package

Link: https://pan.baidu.com/s/11RKURSpVJIb8NTPyFgPCYw
Extraction code: 0818

Guess you like

Origin blog.csdn.net/qq_43475285/article/details/108083467