作业day4

1.实现保留原颜色宽度

作业day4_第1张图片

2.橡皮擦

作业day4_第2张图片

3.撤销

widgh.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
struct LineInfo {
    QLine line;  // 线段
    QColor color; // 颜色
    int width;   // 线宽
};
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    void setColor(const QColor& newColor) { color = newColor; } // 设置当前颜色
    void setWidth(int newWidth) { width = newWidth; } // 设置当前线宽
    ~Widget();

private:
    Ui::Widget *ui;
    QPainter painter;
    QPen pen;
    QPoint start;
    QPoint end;
    QVector lines;
    QColor color;
    int width = 1;
    QWidget *widget = new QWidget;

    QPalette color1;

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;
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();
};
#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)
{
    QPainter painter(this);
    painter.begin(this);

    //painter.drawLines(lines);
   // QPen pen(color, width);
    //pen.setColor(color);
   // pen.setWidth(width);
   // painter.setPen(pen);
    for (const auto& lineInfo : lines) {
        QPen pen(lineInfo.color, lineInfo.width);
        painter.setPen(pen);
        painter.drawLine(lineInfo.line);
    }

    // 绘制当前正在绘制的线段(如果有)
    if (!start.isNull()) {
        QPen pen(color, width);
        painter.setPen(pen);
        painter.drawLine(start, end);
    }
    painter.end();
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    end = event->pos();
    QLine line(start,end);
   //lines << line;// 将鼠标绘制的每一跟线段存入QVector里面,也就是lines里面
    LineInfo lineInfo;
    lineInfo.line = QLine(start, end);
    lineInfo.color = color;
    lineInfo.width = width;
    lines << lineInfo;

    start = end;
    update();
}

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

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    end = event->pos();
}

// 打开调色板
void Widget::on_pushButton_clicked()
{
    color = QColorDialog::getColor(Qt::black,this,"选择颜色");

}

void Widget::on_pushButton_2_clicked()
{
    width = 1;
}

void Widget::on_pushButton_3_clicked()
{
    width = 5;
}

void Widget::on_pushButton_4_clicked()
{
    width = 10;
}



void Widget::on_pushButton_5_clicked()
{

    //QWidget *widget = new QWidget;
    //QPalette palette = widget->palette();
    QPalette color1 = this->palette();
    QColor backgroundColor = color1.color(QPalette::Background);
    QColor color = backgroundColor;
    width = 10;

}
void Widget::on_pushButton_6_clicked()
{
    if (!history.isEmpty()) {
        // 弹出最近的操作
        LineInfo lastOperation = history.pop();
        lines.removeLast(); // 从 lines 中移除

        update(); // 触发重绘

}

你可能感兴趣的:(c++)