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;
}
相关推荐
chenglin0165 分钟前
.NET中,const和readonly区别
开发语言·.net
DXM052123 分钟前
牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记3-地图基本操作与实战案例
开发语言·笔记·学习·arcgis·c#·ae·arcgis engine
Vaclee44 分钟前
JavaScript-基础语法
开发语言·javascript·ecmascript
wuqingshun3141591 小时前
蓝桥杯 11. 打印大X
数据结构·算法·职场和发展·蓝桥杯·深度优先
CodeWithMe1 小时前
【C++】线程池
开发语言·c++
mahuifa2 小时前
Qt内置图标速查表
qt·图标·qstyle·qicon
Blossom.1182 小时前
量子网络:构建未来通信的超高速“高速公路”
网络·opencv·算法·安全·机器学习·密码学·量子计算
A林玖2 小时前
【机器学习】朴素贝叶斯
人工智能·算法·机器学习
六边形战士DONK2 小时前
神经网络基础[损失函数,bp算法,梯度下降算法 ]
人工智能·神经网络·算法
专注API从业者2 小时前
《Go 语言高并发爬虫开发:淘宝商品 API 实时采集与 ETL 数据处理管道》
开发语言·后端·爬虫·golang