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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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;
}