如何用Qt制作简单的鼠标绘图画板(支持导出图片)


01 - 鼠标绘图效果

  GIF没设置好,会有灰色阴影出现

02 - 基本思路

  

开始
等待事件
鼠标按下
鼠标移动
按钮按下
左键,press=true,右键,press=false
if press,point加入list,update界面,画list的所有点
确定,保存为png,清除,clear函数

03 - 代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void paintEvent(QPaintEvent *event);

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
    bool press;
    QPoint point;
    QList<QPoint> point_list;

};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QMouseEvent>
#include <QPainter>
#include <QSize>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setMouseTracking(true);
    this->press = false;
}

Widget::~Widget()
{
    delete ui;
}

//绘画,每次update的时候执行
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);         //创建画板,画板附着在对象this上,也就是Widget窗口
    QPen mypen;                     //创建画笔
    mypen.setWidth(15);             //点的大小
    mypen.setColor(Qt::black);      //点的颜色
    painter.setPen(mypen);          //画板设置画笔

    int i = 0;                      //把每一次鼠标移动的地方进行画点
    while(point_list.size()!=0 && i != point_list.size())
    {
        painter.drawPoint(point_list.at(i));
        i++;
    }
}

//鼠标左键按下,开始记录坐标
void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton){
        this->press = true;
    }
}

//鼠标移动事件
void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)
    {
        if(this->press)     //只有鼠标被按下的时候才记录坐标
        {
            point = event->pos();       //记录坐标
            point_list.append(point);   //记录每一次移动的坐标
            update();                   //更新,让画笔画画
        }

    }
}

//鼠标松开,停止记录
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {
        this->press = false;
    }
}

//确定按键
void Widget::on_pushButton_clicked()
{
    QPixmap pixmap = QPixmap::grabWidget(this);     //把Widget窗口内容转为QPixmap
    QSize picSize(28,28);                           //设置修改的大小为28*28
    QPixmap ret = pixmap.scaled(picSize);           //重新修改QPixmap的大小

    ret.save("C:\\Users\\Administrator\\Desktop\\num.png"); //保存QPixmap为png图片
}

//清除按键
void Widget::on_pushButton_2_clicked()
{
    point_list.clear();     //清空鼠标坐标记录
    update();               //更新,让画笔画画
}

UI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值