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;
}
相关推荐
刘沅6 分钟前
LeetCode 93.复原IP地址
算法·面试
MoonBit月兔9 分钟前
MoonBit v0.10.4版本更新
开发语言·人工智能·编程·moonbit
小樱花的樱花17 分钟前
Linux 多线程编程:互斥锁(Mutex)详解
linux·c语言·开发语言
滴滴滴嘟嘟嘟.40 分钟前
强化学习-PPO 奖励塑形实验:Pendulum-v1 中角速度惩罚权重的影响
开发语言·python
灵晔君1 小时前
【C++】标准模板库STL——set /multiset/map /multimap
开发语言·c++
从此以后自律1 小时前
Java 并发编程完整讲解
java·开发语言
阿里技术1 小时前
Agent 评测:方法论与体系设计
大数据·人工智能·算法
Sylvia33.1 小时前
足球数据接口开发实战:如何用火星数据API盘活赛事应用
java·服务器·开发语言·数据库·python
z落落1 小时前
C# WinForm 自定义控件
开发语言·c#
ch.ju1 小时前
Java程序设计(第3版)第四章——匿名内部类
java·开发语言