作业
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QColorDialog>
#include <QMouseEvent>
#include <QVector>
#include <QKeyEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
// 定义 LineInfo 结构体
struct LineInfo {
QLine line;
QColor color;
int width;
};
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
QPen pen;
QPoint start;
QPoint end;
QColor color;
QColor precolor;
int width;
QVector<LineInfo> lines; // 保存所有线段
bool iser = false;
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(); // 设置线宽为1
void on_pushButton_3_clicked(); // 设置线宽为5
void on_pushButton_4_clicked(); // 设置线宽为10
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);
color = Qt::black; // 默认颜色为黑色
width = 1; // 默认线宽为1
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
// 遍历所有线段并绘制
for (auto perline : lines) {
// 设置当前线段的颜色和宽度
painter.setPen(QPen(perline.color, perline.width));
// 绘制线段
painter.drawLine(perline.line);
}
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() & Qt::LeftButton) {
end = event->pos();
QLine line(start, end); // 设置线段
lines.append({line,color,width}); // 设置颜色
start = end; // 更新起点
update(); // 触发重绘
}
}
void Widget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
start = event->pos(); // 记录起点
}
}
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.isEmpty()) {
lines.pop_back(); // 删除最后一条线段
update(); // 触发重绘
}
} else {
QWidget::keyPressEvent(event); // 调用基类的 keyPressEvent 处理其他按键事件
}
}
// 打开调色板
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()
{
iser = !iser;
if(iser){
// 进入橡皮擦模式,保存当前颜色并将画笔颜色设置为窗口背景色
precolor = color;
// 橡皮擦设置为背景色
color = palette().color(QPalette::Window);
// 按钮文字状态改为“切换到画笔”
ui->pushButton_5->setText("切换到画笔");
}else{
// 退出橡皮擦模式,恢复画笔颜色为之前保存的颜色
color = precolor;
// 按钮文字状态改为“橡皮擦”
ui->pushButton_5->setText("橡皮擦");
}
}