想要实现的是,手写签名的效果,最终把手写的结果保存,也可以加上水印什么的。
在控件的 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

Qt绘制和保存成图片(手写签名)相关推荐

  1. java实现手写签名_手写签字,保存笔迹到图片

    [实例简介] [实例截图] [核心代码] package cn.handwriting; import java.io.ByteArrayOutputStream; import java.io.Fi ...

  2. poi插入图片浮于文字上方_Word插入手写签名

    Word插入手写签名 通常情况下,我们都需要将文本打印出来,签字,扫描,上传,提交.但在国内外很多公司并不这么做.那大家都是怎么处理的呢? 正文 此处我们需要重点说明,如果是基金.合同.工资等相对比较 ...

  3. php手写签名保存,PHP+JS实现PC端+移动端PDF手写签名合并

    PHP+JS实现PC端+移动端PDF手写签名合并 1年前 阅读 3029 评论 0 喜欢 0 前端插件:`jSignature.js` PHP插件:`FPDF+FPDI` `index.html`代码 ...

  4. 手写签名图片处理-Android

    背景 用户通过笔在纸上手写了个人签名,通过拍照上传的方式将其笔迹设置为签名图片. 如果直接使用此图片(包括裁剪后的图片),则在签名的过程中会签名图案中不但有用户的笔迹,还有纸的颜色背景,效果堪忧. 解 ...

  5. HTML5+jSignature插件手写签名生成图片并转换成文件流实现功能

    公司需求html5手写签名,并转换成图片上传服务器 项目结构:jquery+springboot项目需要引入js文件:jquery的jquery.min.js .jSignature插件的 jSign ...

  6. 使用 html2canvas 将页面保存成图片

    有时我们需要实现在浏览器端直接对整个或部分页面进行截屏,比如移动端常见的"长按网页保存为图片"功能.这个借助 html2canvas 这个第三方 js 库即可实现,下面通过样例演示 ...

  7. BitmapUtil【缩放bitmap以及将bitmap保存成图片到SD卡中】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 用于缩放bitmap以及将bitmap保存成图片到SD卡中 效果图 代码分析 bitmapZoomByHeight(Bitmap s ...

  8. JAVA PPT 柱状图_Java 将 PPT 形状(表格、文本框、心形、图表等)保存成图片

    MS PowerPoint中的表格.文本框.心形.图表.图片等均可以称为形状,将这些形状保存成图片,便可分类储存,方便日后查找,再利用. 本文将介绍如何使用 Spire.Presentation fo ...

  9. 第27节 实例-相机显示的内容抓取保存成图片

    本节需求 经常的,我们需要将相机渲染的内容传给其它的机器或者保存成图片.甚至需要将相机显示的内容进行录制,制作成mp4.其实制作成mp4也是用的图片,将每一帧的图片存下来,使用相关库制作成mp4就可以 ...

最新文章

  1. templateref html内容,angular之ng-template模板加载
  2. java jmf 视屏监控的核心代码_Java中利用JMF编写摄像头拍照程序_java
  3. python3字典升序排序_Python(32)常用指引:排序指南
  4. 【SSL】Tomcat8.5 SSL/HTTPS 安装证书 单向认证
  5. linux4.9下alsa架构,[Alsa]4, wm8524 Kernel音频子系统入口
  6. python3.7怎么安装tensorflow_gpu_(更新版)python3.7 Windows10 tensorflow-GPU 安装
  7. OpenSCAD设计的3D打印智能路由器盒子(V1.1)
  8. Java中的线程协作之Condition
  9. 关闭Visual Studio 实时调试器
  10. Volley的原理解析
  11. 一点一点学写Makefile-1
  12. 【数据结构】递归代码模板
  13. 转载牛人的ASP.NET Cookies简单应用 记住用户名和密码
  14. 201671030119 唐盖强 实验十四 课程学习总结
  15. Python:人工智能库如何选择,百度图像识别入门
  16. java中修改上传图片大小,springMVC MultipartFile 上传图片时修改图片大小
  17. 时域OCT(TD-OCT) 我的理解
  18. MSTAR数据集的SAR图像识别 准确率99.17%
  19. poi设置单元格下拉下表
  20. 深度学习计算模型中门函数的作用

热门文章

  1. wxWidgets:日志概述
  2. boost::smart_ptr模块智能指针测试程序
  3. boost::range_pointer相关的测试程序
  4. boost::python::converter::is_object_manager相关的测试程序
  5. boost::mp11::mp_sort_q相关用法的测试程序
  6. boost::hana::mod用法的测试程序
  7. boost::geometry::assign用法的测试程序
  8. Boost:异步操作,涉及重新打包多个操作,但选择仅调用其中一个的测试程序
  9. VTK:Utilities之Scalars
  10. VTK:PolyData之ShrinkPolyData