widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPaintEvent>
#include <QPainter>
#include <QDebug>
#include <QMouseEvent>
#include <QLine>
#include <QVector>
#include <QColorDialog>
#include <QKeyEvent>
struct Lineinfo{
QLine line;
QColor color;
int width;
};
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QPainter painter;
QPen pen;
QPoint start;
QPoint end;
QVector<Lineinfo> lines;
QVector<QPoint> lines_last;
QColor color;
QColor recolor;
int width=1;
int re=0;
protected:
virtual void paintEvent(QPaintEvent *event) override;
virtual void mouseMoveEvent(QMouseEvent *event) override;
virtual void mousePressEvent(QMouseEvent *event) override;
virtual void mouseReleaseEvent(QMouseEvent *event) override;
virtual void keyPressEvent(QKeyEvent *event) override;
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
void on_pushButton_5_clicked();
void on_pushButton_6_clicked();
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
painter.begin(this);
for(auto perline:lines){
pen.setColor(perline.color);
pen.setWidth(perline.width);
painter.setPen(pen);
painter.drawLine(perline.line);
}
painter.end();
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
end = event->pos();
QLine line(start,end);
Lineinfo lineinfo;
lineinfo.color=color;
lineinfo.line=line;
lineinfo.width=width;
lines.append(lineinfo);
// 将鼠标绘制的每一跟线段存入QVector里面,也就是lines里面
start = end;
update();
}
void Widget::mousePressEvent(QMouseEvent *event)
{
start = event->pos();
lines_last<<start;
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
end = event->pos();
}
void Widget::keyPressEvent(QKeyEvent *event)
{
if(event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_Z)
{
if(!lines_last.isEmpty()){
while(lines.last().line.p1() != lines_last.last())
{
lines.removeLast();
}
lines_last.removeLast();
lines.removeLast();
}
}
update();
}
// 打开调色板
void Widget::on_pushButton_clicked()
{
color = QColorDialog::getColor(Qt::black,this,"选择颜色");
}
void Widget::on_pushButton_2_clicked()
{
width = 1;
if(re==1){color=recolor;}
}
void Widget::on_pushButton_3_clicked()
{
width = 5;
if(re==1){color=recolor;}
}
void Widget::on_pushButton_4_clicked()
{
width = 10;
if(re==1){color=recolor;}
}
void Widget::on_pushButton_5_clicked()
{
recolor=color;
color=palette().color(QPalette::Window);
re=1;
}