生活随笔
收集整理的這篇文章主要介紹了
Qt绘制和保存成图片(手写签名)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
想要實現的是,手寫簽名的效果,最終把手寫的結果保存,也可以加上水印什么的。
在控件的 MouseButtonPress 和 MouseMove 事件中,保存繪制的路徑,然后再 Paint 重繪事件中繪制即可:
特別需要注意的是,QImage QPixmap構造時,只是分配了空間,但是沒有清空內存的,所以需要使用 fill() 填充圖像,否則可能會得到混亂的圖像.
QImage img(ui->widgetPaint->size(),QImage::Format_ARGB32);img.fill(Qt::white);
QPainter::setRenderHint((QPainter::Antialiasing,true))設置抗鋸齒.
QPen構造的參數可以設置繪制的線形、線條末端形狀、線條交匯處形狀等.
QPainter painter(device);painter.setRenderHint(QPainter::Antialiasing,true);painter.setPen(QPen(Qt::black,7,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
簡單的添加水印的代碼:
? ?
QImage img(ui->widgetPaint->size(),QImage::Format_ARGB32);img.fill(Qt::white);{//水印QImage bg("bg.png");QPainter painter(&img);int len = sqrt(img.width() * img.width() + img.height() * img.height());painter.rotate(-45);for(int i = -len / 2;i < len / 2;i += bg.width()){bool flag = true;for(int j = 0;j < len;j += bg.height()){painter.drawImage(flag ? i : i - bg.width() / 2,j,bg);flag = !flag;}}}Paint(&img);
加水印后保存的效果:
大概的代碼:
.h
?
#ifndef WIDGETSIGN_H
#define WIDGETSIGN_H
#include <QWidget>
#include <vector>
namespace Ui {
class WidgetSign;
}
class WidgetSign : public QWidget
{Q_OBJECT
public:explicit WidgetSign(QWidget *parent = 0);~WidgetSign();
protected:bool eventFilter(QObject * obj, QEvent * event);void paintEvent(QPaintEvent *);
private slots:void on_btnClear_clicked();void on_btnSave_clicked();
private:void Paint(QPaintDevice * device);
private:Ui::WidgetSign * ui;QVector<QVector<QPoint> > vec_;
};
#edif // WIDGETSIGN_H
.cpp
#include "WidgetSign.h"
#include "ui_WidgetSign.h"
#include "PublicStruct.h"
#include <math.h>
#include <QMouseEvent>
#include <QPainter>
#include <QBitmap>
WidgetSign::WidgetSign(QWidget *parent) :QWidget(parent),ui(new Ui::WidgetSign)
{ui->setupUi(this);ui->widgetPaint->installEventFilter(this);
}
WidgetSign::~WidgetSign()
{delete ui;
}
bool WidgetSign::eventFilter(QObject * obj, QEvent * event)
{if(obj == ui->widgetPaint){if(event->type() == QEvent::MouseButtonPress){vec_.push_back(QVector<QPoint>());vec_[vec_.size() - 1].push_back(((QMouseEvent *)event)->pos());ui->widgetPaint->update();}else if(event->type() == QEvent::MouseMove){vec_[vec_.size() - 1].push_back(((QMouseEvent *)event)->pos());ui->widgetPaint->update();}else if(event->type() == QEvent::Paint){Paint(ui->widgetPaint);}}return QWidget::eventFilter(obj,event);
}
void WidgetSign::on_btnClear_clicked()
{vec_ = QVector<QVector<QPoint> >();ui->widgetPaint->update();
}
void WidgetSign::on_btnSave_clicked()
{if(vec_.size() <= 0){TOAST("請先簽名");return;}QImage img(ui->widgetPaint->size(),QImage::Format_ARGB32);img.fill(Qt::white);/*{//水印QImage bg("bg.png");QPainter painter(&img);int len = sqrt(img.width() * img.width() + img.height() * img.height());painter.rotate(-45);for(int i = -len / 2;i < len / 2;i += bg.width()){bool flag = true;for(int j = 0;j < len;j += bg.height()){painter.drawImage(flag ? i : i - bg.width() / 2,j,bg);flag = !flag;}}}*/Paint(&img);QString imgPath = "sign.png";bool ret = img.save(imgPath);TOAST(ret ? "簽名保存成功" : "簽名保存失敗");
}
void WidgetSign::Paint(QPaintDevice * device)
{QPainter painter(device);painter.setRenderHint(QPainter::Antialiasing,true);painter.setPen(QPen(Qt::black,7,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));for(int i = 0;i < vec_.size();++i){for(int j = 0;j < vec_[i].size() - 1;++j){painter.drawLine(vec_[i][j],vec_[i][j + 1]);}}
}
void WidgetSign::paintEvent(QPaintEvent *)
{QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
————————————————
版權聲明:本文為CSDN博主「yangyang031213」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yangyang031213/article/details/102639958
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的Qt绘制和保存成图片(手写签名)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。