QT实现绘图功能

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;
}
相关推荐
rosmis21 小时前
地铁病害检测系统软件改进记录-2-02
开发语言·前端·javascript
long31621 小时前
K‘ 未排序数组中的最小/最大元素 |期望线性时间
java·算法·排序算法·springboot·sorting algorithm
进击的小头21 小时前
FIR滤波器实战:音频信号降噪
c语言·python·算法·音视频
欧阳x天21 小时前
STL详解(九)—— stack和queue的模拟实现
开发语言·c++
xqqxqxxq21 小时前
洛谷算法1-1 模拟与高精度(NOIP经典真题解析)java(持续更新)
java·开发语言·算法
razelan21 小时前
初级算法技巧 4
算法
砍树+c+v21 小时前
3a 感知机训练过程示例(手算拆解,代码实现)
人工智能·算法·机器学习
zy_destiny21 小时前
【工业场景】用YOLOv26实现4种输电线隐患检测
人工智能·深度学习·算法·yolo·机器学习·计算机视觉·输电线隐患识别
沐知全栈开发21 小时前
Rust 函数
开发语言
智驱力人工智能21 小时前
货车违规变道检测 高速公路安全治理的工程实践 货车变道检测 高速公路货车违规变道抓拍系统 城市快速路货车压实线识别方案
人工智能·opencv·算法·安全·yolo·目标检测·边缘计算