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;
}
相关推荐
其实防守也摸鱼2 小时前
CTF密码学综合教学指南--第九章
开发语言·网络·python·安全·网络安全·密码学·ctf
砚底藏山河2 小时前
Python量化开发:2026最佳实时股票数据API接口推荐与对比
开发语言·windows·python
AlunYegeer3 小时前
JAVA,以后端的视角理解前端。在全栈的路上迈出第一步。
java·开发语言·前端
浅念-3 小时前
刷穿LeetCode:BFS 解决 Flood Fill 算法
数据结构·c++·算法·leetcode·职场和发展·bfs·宽度优先
hixiong1233 小时前
C# OpenvinoSharp使用DINOv2模型进行图像相似度计算
开发语言·c#
做cv的小昊4 小时前
【TJU】研究生应用统计学课程笔记(8)——第四章 线性模型(4.1 一元线性回归分析)
笔记·线性代数·算法·数学建模·回归·线性回归·概率论
DFT计算杂谈4 小时前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化
EW Frontier4 小时前
6G ISAC新范式:基于智能漏波天线的Wi‑Fi通感一体化系统设计与实测【附MATLAB+python代码】
开发语言·python·matlab·music·isac·doa·wi‑fi
贾斯汀玛尔斯4 小时前
每天学一个算法--倒排索引(Inverted Index)
算法·inverted-index