Qt-qrencode开发-生成、显示二维码📀
Qt-qrencode开发-生成二维码
1、概述
qrencode是一个用于生成QR码(二维码)的库,它支持多种编程语言的接口,包括C、C++、Python等。QR码是一种矩阵式二维码,常用于存储网址、联系信息、文字信息等,广泛应用于各种场景,如产品追踪、广告宣传、文档管理等。
qrencode的设计简洁高效,提供了易于使用的API接口,使得开发者能够轻松地在应用程序中集成QR码生成和处理功能库的基本特性
- 生成能力:
qrencode库能够生成不同版本和纠错级别的QR码,支持从最小的版本1(21x21的模块)到最高的版本40(177x177的模块),并且可以根据需要调整纠错等级(L、M、Q、H)。- 输出格式:库支持生成多种格式的输出,包括PNG图片、SVG矢量图、ASCII文本形式的二维码等,这取决于库的具体实现和使用的接口。
- 编码内容:支持多种数据类型编码,如数字、字母、二进制数据、UTF-8文本、电子邮件地址、电话号码、URL等。
- C++接口:对于C++,
qrencode提供了丰富的类和方法来方便地生成二维码。用户可以创建一个QRcode对象,向其中添加数据,然后将其渲染成所需的格式。- C接口:对于C语言使用者,
qrencode也提供了函数接口,通过这些函数可以直接操作二维码数据结构,进行编码和输出。- 跨平台:
qrencode库是跨平台的,可以在多种操作系统上编译和使用,包括Windows、Linux、macOS等。- 依赖:在某些情况下,如生成PNG图片输出时,
qrencode可能需要额外的依赖,如libpng和zlib库。
开发环境说明
- 系统:Windows11、Ubuntu20.04
- Qt版本:V5.14.2
- 编译器:MSVC2017-64、GCC/G++64
- qrencode版本:4.1.1
2、实现效果
- 将qrencode使用Qt封装为一个生成、显示二维码的控件;
- 支持使用QPainter绘制显示二维码;
- 可通过函数接口返回生成的二维码QImage;
- 可通过调用函数将生成的二维码保存到指定路径;
- 支持使用源码嵌入工程(更好的跨平台、支持各种编译器);
- 支持使用编译好的静态库(MSVC2017-64);

3、编译qrencode
将qrencode-4.1.1解压后,创建一个build文件夹;
打开Cmake,将qrencode-4.1.1文件夹下的CMakeLists.txt文件拖入CMake中;
点击【Configure】;
这里我选择了MSVC2017-64编译器,点击【Finish】;

如下图所示进行配置,配置不正确会由于没有准备依赖而报错;
- 设置编译后的安装路径为
C:/Users/MHF/Downloads/qrencode-4.1.1/QRencode; - 勾选WITHOUT_PNG,表示不支持png;
- 取消勾选WITH_TOOLS,否则会报错。

- 设置编译后的安装路径为
然后点击【Generate】、【Open Project】打开VS;
鼠标右键选择【ALL_BUILD】,点击【生成】,然后选择【INSTALL】,点击【生成】;

就可以在安装路径下生成编译好的文件了;

4、在QT中引入编译为静态库的QRencode
创建一个工程,将编译后的QRencode文件夹复制到工程中;
在工程的pro文件中添加下列代码;
CONFIG(debug, debug|release): {
LIBS += -L$$PWD/QRencode/lib/ -lqrencoded
}else{
LIBS += -L$$PWD/QRencode/lib/ -lqrencode
}
INCLUDEPATH += $$PWD/QRencode/include
DEPENDPATH += $$PWD/QRencode/include
5、在Qt中直接使用QRencode源码
将qrencode-4.1.1文件夹中除了.h、.c、config.h.in外的文件删除,文件夹也删除,qrenc.c也删除;
将
config.h.in重命名为config.h;在pro文件中添加所有
.h 、.c文件;注意:还需要添加
DEFINES += HAVE_CONFIG_HDEFINES += HAVE_CONFIG_H
SOURCES += \
main.cpp \
qrencode/bitstream.c \
qrencode/mask.c \
qrencode/mmask.c \
qrencode/mqrspec.c \
qrencode/qrencode.c \
qrencode/qrinput.c \
qrencode/qrspec.c \
qrencode/rsecc.c \
qrencode/split.c \
widget.cpp HEADERS += \
qrencode/bitstream.h \
qrencode/config.h \
qrencode/mask.h \
qrencode/mmask.h \
qrencode/mqrspec.h \
qrencode/qrencode.h \
qrencode/qrencode_inner.h \
qrencode/qrinput.h \
qrencode/qrspec.h \
qrencode/rsecc.h \
qrencode/split.h \
widget.h
编译后会报错
error: C2065: “MAJOR_VERSION”: 未声明的标识符;
打开
config.h文件,如下图所示;
将
MAJOR_VERSION、MICRO_VERSION、MINOR_VERSION、VERSION四项修改为如下所示,与自己下载的版本号相同;
然后就可以正常编译了;
6、在Qt中使用QRencode生成二维码示例
在ui文件中添加下列控件,并将QWidget提升为QrCodeView;

实现代码
#include "qrcodeview.h"
#include "qrencode.h"
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QPainter> QrCodeView::QrCodeView(QWidget* parent)
: QWidget{parent}
{} void QrCodeView::setString(const QString& str)
{
if (str.isEmpty())
return;
if (m_str == str)
return;
m_str = str; QRcode* qrcode = QRcode_encodeString(str.toStdString().data(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);
if (!qrcode) // 错误返回null
{
qInfo() << errno; // 打印错误码
return;
} int w = qMin(this->width(), this->height()); // 控件长宽的最小值,保证绘制完整正方形
int qrcodeW = qMax(qrcode->width, 1);
qreal size = w / qreal(qrcodeW); // 二维码小格子的长宽 m_img = QImage(w, w, QImage::Format_ARGB32);
QPainter painter(&m_img);
painter.setBrush(Qt::white); // 设置白色笔刷
painter.setPen(Qt::NoPen);
painter.drawRect(0, 0, w, w); // 绘制w x w的白色背景
painter.setBrush(Qt::black); // 设置黑色笔刷用于绘制方块 for (qint32 y = 0; y < qrcodeW; y++)
{
for (qint32 x = 0; x < qrcodeW; x++)
{
unsigned char b = qrcode->data[(y * qrcodeW) + x];
if (b & 0x01) // 1=黑、0=白
{
QRectF rect(x * size, y * size, size, size);
painter.drawRect(rect); // 绘制黑色格子
}
}
}
delete qrcode;
qrcode = nullptr; this->update(); // 绘制图片
} /**
* @brief 保存生成的二维码图片到指定路径
* @param path 保存路径 + 名称.jpg
* @return true 保存成功
*/
bool QrCodeView::save(const QString& path)
{
if (path.isEmpty() || m_img.isNull())
return false; QFileInfo info(path);
if (info.suffix() == "jpg" || info.suffix() == "JPG") // 只支持保存为jpg格式
{
QDir().mkpath(info.path()); // 创建路径,防止路径不存在
return m_img.save(path);
}
else
{
return false;
}
} /**
* @brief 返回生成的二维码图片
* @return
*/
QImage QrCodeView::getImage()
{
return m_img;
} /**
* @brief 在控件中显示二维码
* @param event
*/
void QrCodeView::paintEvent(QPaintEvent* event)
{
QWidget::paintEvent(event); QPainter painter(this);
int x = (this->width() - m_img.width()) / 2;
int y = (this->height() - m_img.height()) / 2;
painter.drawImage(x, y, m_img);
}
7、完整源代码
️
️
️
|/
️
️ ️
_
Qt-qrencode开发-生成、显示二维码📀的更多相关文章
- 我写的一个Qt 显示二维码( QR Code)的控件(可以去掉对 libpthread 的依赖,而且编译出的库文件可以在 vc2010 的release 模式下使用)
最近一个项目需要显示二维码,所以花了点时间(只用了一个晚上,写的很不完善),写了个显示二维码的控件.当然这个控件用到了些开源的代码,比如qrencode,所以我也打算把我的代码开源. 我的代码参考了 ...
- mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案
微信小程序概念的提出,绝对可以算得上中国IT界惊天动地的一件大事,这可能意味着一场新的开发热潮即将到来, 我也怀着激动的心情准备全身心投入其中,不过截止目前,在官方网站上下载的最新版本都无法使用,打开 ...
- 解决Mac版微信小程序开发工具打开后无法显示二维码
问题描述: 正常情况下,打开微信小程序开发工具后,首页提示扫描二维码进行登陆,但是如果不显示二维码,当然无法登陆. 解决方案: 无法显示二维码肯定是程序运行哪里出错了,我们直接点击桌面图标是无法排查错 ...
- 【转】mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案
转自:https://www.cnblogs.com/stevenluo/p/6030445.html 微信小程序概念的提出,绝对可以算得上中国IT界惊天动地的一件大事,这可能意味着一场新的开发热 ...
- 公司开发的APP,如何生成一个二维码,供客户下载使用
1.其实和简单,因为一般的用户使用扫一扫,大多数都是用微信自带的扫一扫工具 而,微信打开的二维码页面,会自动屏蔽apk文件,所以显然把apk的url生成一个二维码,让用户扫一扫就能直接下载,这样是行不 ...
- iOS开发-定制多样式二维码
iOS开发-定制多样式二维码 二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息. 最常 ...
- Android开发之扫描二维码开发
原贴地址:http://www.cnblogs.com/Fndroid/p/5540688.html 二维码其实有很多种,但是我们常见的微信使用的是一种叫做QRCode的二维码,像下面这样的,可以放心 ...
- pbfunc外部函数扩展应用-直接在Datawindow中生成QR二维码,非图片方式
利用pbfunc外部函数在Datawindow中直接生成QR二维码,非图片方式.需要注意以下面几点: Datawindow的DataObject的单位必须为像素(Pixels). Datawindow ...
- Google API快速生成QR二维码
Google API快速生成QR二维码 现在来说生成二维码最简单的方法是使用Google Chart API来实现,再次膜拜Google大神- Google Chart API是一套可以让你在线生成报 ...
- 分享:Java 开发精美艺术二维码
博客地址:https://ainyi.com/58 Java 开发精美艺术二维码 看到网络上各种各样的二维码层出不穷,好像很炫酷的样子,一时兴起,我也要制作这种炫酷二维码效果 例如: 根据以往例子 根 ...
随机推荐
- SSH的密码qsnctfwp
开启 kali,在终端输入ssh root@challenge.qsnctf.com -p [port]可以访问远程 SSH 系统 根据提供的 passlist.txt 文件内容进行密码爆破 编写 S ...
- centos6.5源码编译http2.4.9、虚拟主机、基于用户认证
centos6.5源码编译http2.4.9.虚拟主机.基于用户认证 2014-04-23 07:45 作者: 51linux 来源: 本站 浏览: 0 views 我要评论 字号: 大 中 ...
- .gitignore 基础
前言 gitignore文件有几种方式生成. 1.在创建版本库的时候生成. 2.自己手动添加: windows环境下,不能把文件直接改名为.gitignore,会提示你必须输入文件名.所以我们先新建一 ...
- MVC过滤器简单刨析
前言 简单介绍一下过滤器. 正文 看下过滤器类型: action: 在动作方法之前及之后执行 result: 在action结果被执行前或者之后执行,比如说返回一个视图,再执行视图前执行一个方法,再执 ...
- leetcode:655. 输出二叉树
655. 输出二叉树 在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则: 1> 行数 m 应当等于给定二叉树的高度. 2> 列数 n 应当总是奇数. 3> 根节点的值(以 ...
- 推荐一波微软家的浏览器:EDGE
前段时间英雄联盟(LOL)队伍 EDG 夺冠成为热门事件,上了各大热搜,即使大家不玩英雄联盟,相信也多多少少有听说相关信息吧! 今天我们的主角并不是 EDG,而是微软的新版浏览器 EDGE !!! 微 ...
- 阿里开源自研工业级稀疏模型高性能训练框架 PAI-HybridBackend
简介:近年来,随着稀疏模型对算力日益增长的需求, CPU集群必须不断扩大集群规模来满足训练的时效需求,这同时也带来了不断上升的资源成本以及实验的调试成本.为了解决这一问题,阿里云机器学习PAI平台开 ...
- 阿里云数字化安全生产平台 DPS V1.0 正式发布!
简介:数字化安全生产平台则帮助客户促进业务与 IT 的全面协同,从业务集中监控.业务流程管理.应急指挥响应等多维度来帮助客户建立完善专业的业务连续性保障体系. 作者:银桑.比扬 阿里云创立于 200 ...
- 庖丁解InnoDB之REDO LOG
简介: 数据库故障恢复机制的前世今生一文中提到,今生磁盘数据库为了在保证数据库的原子性(A, Atomic) 和持久性(D, Durability)的同时,还能以灵活的刷盘策略来充分利用磁盘顺序写的 ...
- EDA 事件驱动架构与 EventBridge 二三事
简介: 事件驱动型架构 (EDA) 方兴未艾,作为一种 Serverless 化的应用概念对云原生架构具有着深远影响.当我们讨论到一个具体架构时,首当其冲的是它的发展是否具有技术先进性.这里从我们熟 ...