如何用Qt製作簡單的滑鼠繪圖畫板(支援匯出圖片)
阿新 • • 發佈:2018-12-31
文章目錄
01 - 滑鼠繪圖效果
GIF沒設定好,會有灰色陰影出現
02 - 基本思路
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(); //更新,讓畫筆畫畫
}