——今天的我们,是站在巨人的肩膀上前行。

二维码自从出现以来,已经极大地改变了我们的生活方式,它能容纳一些简短的信息,却又不那么简短,以至于很多场合都能使用二维码作为信息的载体。一个月以前,有个老师跟我提过一句,如果可以在上机实验时使用二维码来绑定学生的信息,就可以省很多时间。于是我就萌生了使用Qt绘制二维码的想法。

但是这一个月来我一直在研究另一个东西,直到昨天我才研究出一点进展。那个做好之后我就开始研究如何使用Qt生成二维码,发现二维码是有不同标准的,比如在二维码符号表示技术研究方面已研制出多种码制,常见的有PDF417、QR Code、Code 49、Code 16K、Code One等。常用的二维码相关的库也有很多zbar、zxing、libqrencode等。

这次我选用了Github上的 Nayuki 大神所写的QRcode库c++版本,放入Qt中,实现了承载指定信息的二维码的绘制功能。下面是一些总结。

一、QR Code码

QR Code码,是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。

二、二维码生成库的源码

Github上的大佬 Nayuki:https://github.com/nayuki 提供了QR Code码相关的图片生成库,包含了C、C++、Java、JavaScript 、Python 、Rust 等语言的各个版本,代码简洁清晰,质量非常高。

我也把这份代码fork到了我的仓库中,如果想重现我的操作也可以从我的Github主页上获取相关的源代码 https://github.com/gengyuchao/QR-Code-generator

本次我使用的是c++版本的代码 文件夹名为cpp

三、创建Qt工程

1、在windows下创建Qt工程

点击下一步直至完成

2、添加库源文件

将下载的 QR-Code-generator-master.zip 中的 cpp文件夹里的

“BitBuffer.cpp”、“BitBuffer.hpp”、

“QrCode.cpp”、“QrCode.hpp”、

“QrSegment.cpp”、“QrSegment.hpp”、

解压到工程目录“G:\Qt_Project\Create_QRcode”下

最一开始的工程目录是这样子的,然后我们在工程文件夹上右击,选择Add Existing Directory 把刚刚解压的库文件添加进去

取消勾选已有的 main.cpp 、mainwindows.cpp 、mainwindows.h 然后 点击OK即可

添加后的工程目录变成了这样

运行之后发现没有错误(如果你不小心在上一步直接点了OK、工程会报错,原因是重复添加了之前的文件 右击打开pro文件 删除重复的 main.cpp 、mainwindows.cpp 、mainwindows.h 即可)

3、编写二维码绘制函数

根据库的说明文档,我们可以知道这个库的使用方法如下:

C++ language:#include <string>
#include <vector>
#include "QrCode.hpp"
using namespace qrcodegen;// Simple operation
QrCode qr0 = QrCode::encodeText("Hello, world!", QrCode::Ecc::MEDIUM);
std::string svg = qr0.toSvgString(4);// Manual operation
std::vector<QrSegment> segs =QrSegment::makeSegments("3141592653589793238462643383");
QrCode qr1 = QrCode::encodeSegments(segs, QrCode::Ecc::HIGH, 5, 5, 2, false);
for (int y = 0; y < qr1.getSize(); y++) {for (int x = 0; x < qr1.getSize(); x++) {(... paint qr1.getModule(x, y) ...)}
}

添加头文件#include <string> #include <vector> #include "QrCode.hpp" 使用命名空间

using namespace qrcodegen;

然后就可以使用下面的函数了

于是我创建了函数  void Show_QRcode_Picture() 并把它添加进 mainwindows.h头文件中

void MainWindow::Show_QRcode_Picture()
{// Manual operationstd::vector<QrSegment> segs =QrSegment::makeSegments("3141592653589793238462643383");QrCode qr1 = QrCode::encodeSegments(segs, QrCode::Ecc::HIGH, 5, 5, 2, false);for (int y = 0; y < qr1.getSize(); y++) {for (int x = 0; x < qr1.getSize(); x++) {//(... paint qr1.getModule(x, y) ...)}}
}

将实例代码添加进去

我的方案是

使用Qt的QImage进行图像的编辑 ->转换为QPixmap-> 在QLabel中显示

4、在mainwindows.ui中添加控件

添加QLabel、QTextEdit和一个Button按钮

5、代码实现

//添加头文件:
#include "QImage"//创建二维码画布QImage QrCode_Image=QImage(qr1.getSize(),qr1.getSize(),QImage::Format_RGB888);//图像大小转换为适当的大小QrCode_Image=QrCode_Image.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio);//转换为QPixmap在Label中显示ui->label->setPixmap(QPixmap::fromImage(QrCode_Image));

完整代码如下:

void MainWindow::Show_QRcode_Picture(QString message)
{// Manual operationstd::vector<QrSegment> segs =QrSegment::makeSegments(message.toLatin1());QrCode qr1 = QrCode::encodeSegments(segs, QrCode::Ecc::HIGH, 5, 5, 2, false);//创建二维码画布QImage QrCode_Image=QImage(qr1.getSize(),qr1.getSize(),QImage::Format_RGB888);for (int y = 0; y < qr1.getSize(); y++) {for (int x = 0; x < qr1.getSize(); x++) {if(qr1.getModule(x, y)==0)QrCode_Image.setPixel(x,y,qRgb(255,255,255));elseQrCode_Image.setPixel(x,y,qRgb(0,0,0));}}//图像大小转换为适当的大小QrCode_Image=QrCode_Image.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio);//转换为QPixmap在Label中显示ui->label->setPixmap(QPixmap::fromImage(QrCode_Image));}void MainWindow::on_Create_Button_clicked()
{Show_QRcode_Picture(ui->textEdit->toPlainText());
}

6、需要注意

下面内容摘自百度百科:

1、符号规格从版本1(21×21模块)到版本40(177×177 模块),每提高一个版本,每边增加4个模块。

2、数据类型与容量(参照最大规格符号版本40-L级):

数字数据:7,089个字符

字母数据: 4,296个字符

8位字节数据: 2,953个字符

汉字数据:1,817个字符

3、数据表示方法:

深色模块表示二进制"1",浅色模块表示二进制"0"。

4、纠错能力:

L级:约可纠错7%的数据码字

M级:约可纠错15%的数据码字

Q级:约可纠错25%的数据码字

H级:约可纠错30%的数据码字

5、结构链接(可选)

可用1-16个QR Code码符号表示一组信息。每一符号表示100个字符的信息。

当前的规格为5,如果你的内容超过了最大数据量,就会造成程序崩溃。如果需要在二维码中添加更多的信息,你可以适当地修改模块版本,以增大数据容量。

最后的效果

至此,我们的二维码生成器就做好了。欢迎大家和我一起交流讨论。整个工程我已经上传至我的Github主页上(https://github.com/gengyuchao/Create_QRcode),欢迎访问~

使用Qt绘制二维码 QRcode相关推荐

  1. 基于jquery类库的绘制二维码的插件jquery.qrcode.js

     jquery.qrcode.min.js 如下 (function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.d ...

  2. Winform中使用zxing和Graphics实现自定义绘制二维码布局

    场景 zxing.dll下载 https://download.csdn.net/download/badao_liumang_qizhi/11623214 效果 实现 根据上面文章中将简单的二维码生 ...

  3. uniapp小程序绘制二维码生成图片截图保存到本地

    项目场景: 适应于uniapp中二维码生成图片进行截图保存 问题描述: 今天用uniapp写小程序二维码并保存到本地,网上的完全没有用,最后自己写了一个, 1.使用weapp.qrcode生成二维码, ...

  4. 微信小程序绘制二维码

    一.前言 在日常的小程序项目中,会经常遇到需要动态绘制二维码的需求.使用场景很多,例如绘制在海报上,例如制作票务码.核销码等等. 这篇文章是应一位好友的需求而写的,也希望能够给有需要的同学一些帮助. ...

  5. 微信小程序使用canvas绘制二维码实现跳转小程序

    开始接到这个需求的时候,我查阅文档获取小程序码 | 微信开放文档 发现两种途径 需要后端在服务器上调用接口拿到二维码,因为调用的 https://api.weixin.qq.com这个域名是不允许上白 ...

  6. 微信小程序绘制二维码(附微信小程序开发学习手册)

    一.前言 在日常的小程序项目中,会经常遇到需要动态绘制二维码的需求.使用场景很多,例如绘制在海报上,例如制作票务码.核销码等等. 这篇文章是应一位好友的需求而写的,也希望能够给有需要的同学一些帮助. ...

  7. JAVA生成二维码QRcode

    JAVA生成二维码QRcode 1 : 配置集成 1.1.配置maven 1.2.配置文件 1.3.logo文件 2 : 代码集成 2.1.加载配置文件 2.2.工具类 2.3.测试类 3 : 测试结 ...

  8. 在H5、微信小程序中使用canvas绘制二维码、分享海报

    在H5.微信小程序中使用canvas绘制二维码.分享海报 文章目录 在H5.微信小程序中使用canvas绘制二维码.分享海报 前言 一.canvas绘制二维码 1.H5中使用canvas 2.微信小程 ...

  9. java 生成二维码 QRCode、zxing 两种方式

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

最新文章

  1. 从入门到精通系列Java高级工程师路线介绍,附答案
  2. android 地图相册,时光地图相册
  3. python3.7安装wordcloud_Python中的wordcloud库安装问题及解决方法
  4. Centos下chef安装、部署
  5. SAP CRM里的settype和relationship有什么区别
  6. LOAM_velodyne学习(三)
  7. 开发运维日常坑 总结 51-100
  8. install 命令用法详解
  9. 一篇全面的 MySQL 高性能优化实战总结!
  10. 爬虫python需要安装吗_python爬虫需要安装什么
  11. mysql建用户注册登录表_登录注册数据库建立
  12. 锂电池电池管理系统 中颖SH367309保护板方案
  13. SwiftUI 控件
  14. ios addressbook
  15. 解决java.lang.ClassCastException class java.lang.Integer cannot be cast to class java.lang.Long异常
  16. 复盘618:数字狂欢背后透露了哪些隐藏信号?
  17. html字体怎么变大变粗,ppt如何加粗字体更粗 幻灯片的艺术字怎么把字体变粗?...
  18. 年轻人的第一次汉化APK(教程)
  19. MTK芯片技术资料大全,各个型号都有,包括原理图数据表等
  20. 10G 网络变压器 10GBASE-T与1000Base-T区别

热门文章

  1. 【shell】How can I create a select menu in a shell script?
  2. python爬取自如房间信息(一)
  3. 计算机显卡的性能参数,关于电脑显卡的技术参数与性能的关系
  4. C++语言Switch函数使用小贴士
  5. LINUX 无法输入密码 或者数字键不能使用
  6. 计算机网络手写笔记图片,一键收藏!清华学子这样记笔记!
  7. 重庆大学计算机学院马前,以梦为马,以论为矛
  8. IPFS系列 - 体验 IPFS Docker
  9. LaTeX报错解决办法:arithmetic: number too big ! Dimension too large.
  10. Java笔记:面向对象3大特性