作業:
1:實現繪圖的時候,顏色的隨時調整
2:追加橡皮擦功能
3:配合鍵盤事件,實現功能
當鍵盤按 ctrl+z的時候,撤銷最后一次繪圖
頭文件.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QMouseEvent>
#include<QPaintEvent>
#include<QPainter>
#include<QPen>
#include<QColor>
#include<QLine>
#include<QPoint>
#include<QPixmap>//圖像容器
#include<QColorDialog>
#include<QStack> //棧存儲歷史狀態
#include<QKeyEvent>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
void paintEvent(QPaintEvent *event) override;
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();private:Ui::Widget *ui;QPoint p;QPainter painter;QPixmap *pix;QPen pen;QColor penColor;int penWidth;bool iseraser;QStack<QPixmap> historyStack; // 歷史畫布棧
};
#endif // WIDGET_H
CPP
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),pix(new QPixmap(this->width(),this->height()))//實例化圖紙大小及空間,penColor(Qt::green),penWidth(5),iseraser(false)
{ui->setupUi(this);//填充圖紙顏色pix->fill();//fill默認白色
}Widget::~Widget()
{delete ui;delete pix;
}void Widget::mousePressEvent(QMouseEvent *event)
{historyStack.push(*pix);//保存當前畫布狀態p=event->pos();
}void Widget::mouseMoveEvent(QMouseEvent *event)
{//讓畫家在圖紙上畫畫QPainter painter(pix);//實例化一支筆QPen pen;//(QColor("green"));if(iseraser){pen.setColor(Qt::white);pen.setWidth(30);}else{pen.setColor(penColor);pen.setWidth(penWidth);}//把筆給畫家painter.setPen(pen);//讓畫家畫線painter.drawLine(p,event->pos());//更新起始位置p=event->pos();//調用updata,觸發繪制事件的發生this->update();}
void Widget::paintEvent(QPaintEvent *event)
{//實例化畫家QPainter painter(this);//讓畫家畫到窗口//讓畫家畫圖像,把第一個畫家的畫 畫到窗口painter.drawPixmap(QPoint(0,0),*pix);
}void Widget::keyPressEvent(QKeyEvent *event)
{if (event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_Z){if (!historyStack.isEmpty()){*pix = historyStack.pop(); // 取出棧頂的歷史畫布this->update(); // 重新繪制界面}}
}void Widget::on_pushButton_clicked()
{//顏色QColor color=QColorDialog::getColor(penColor,this,"選擇顏色");penColor=color;iseraser=false;}void Widget::on_pushButton_2_clicked()
{//粗細penWidth=5;iseraser=false;
}void Widget::on_pushButton_3_clicked()
{//粗細10penWidth=10;iseraser=false;
}void Widget::on_pushButton_4_clicked()
{//粗細20penWidth=20;iseraser=false;
}void Widget::on_pushButton_5_clicked()
{//橡皮iseraser= true;
}