当前位置: 首页 > news >正文

Qt中基于开源库QRencode生成二维码(附工程源码链接)

目录

1.QRencode简介

2.编译qrencode

3.在Qt中直接使用QRencode源码

3.1.添加源码

3.2.用字符串生成二维码

3.3.用二进制数据生成二维码

3.4.界面设计

3.5.效果展示

4.注意事项

5.源码下载


1.QRencode简介

        QRencode是一个开源的库,专门用于生成二维码(QR Code)。它支持多种编程语言的接口,包括C、C++、Python等。QR码是一种矩阵式二维码,常用于存储网址、联系信息、文字信息等,广泛应用于各种场景,如产品追踪、广告宣传、文档管理等。

        QRencode的设计简洁高效,提供了易于使用的API接口,使得开发者能够轻松地在应用程序中集成QR码生成和处理功能。

        它的官网:libqrencode

        特性与优势

  1. 输出格式:库支持生成多种格式的输出,包括PNG图片、SVG矢量图、ASCII文本形式的二维码等,这取决于库的具体实现和使用的接口。
  2. C++接口:对于C++,qrencode提供了丰富的类和方法来方便地生成二维码。用户可以创建一个QRcode对象,向其中添加数据,然后将其渲染成所需的格式。
  3. 跨平台qrencode库是跨平台的,可以在多种操作系统上编译和使用,包括Windows、Linux、macOS等。
  4. 生成能力qrencode库能够生成不同版本和纠错级别的QR码,支持从最小的版本1(21x21的模块)到最高的版本40(177x177的模块),并且可以根据需要调整纠错等级(L、M、Q、H)。
  5. C接口:对于C语言使用者,qrencode也提供了函数接口,通过这些函数可以直接操作二维码数据结构,进行编码和输出。
  6. 依赖:在某些情况下,如生成PNG图片输出时,qrencode可能需要额外的依赖,如libpngzlib库。

2.编译qrencode

  1. 下载源代码
  2. 将qrencode-4.1.1解压后,创建一个build文件夹;

  3. 打开Cmake,将qrencode-4.1.1文件夹下的CMakeLists.txt文件拖入CMake中;

  4. 点击【Configure】;

  5. 这里我选择了MSVC2017-64编译器,点击【Finish】;

  6.如下图所示进行配置,配置不正确会由于没有准备依赖而报错;

  1. 设置编译后的安装路径为C:/Users/MHF/Downloads/qrencode-4.1.1/QRencode
  2. 勾选WITHOUT_PNG,表示不支持png;
  3. 取消勾选WITH_TOOLS,否则会报错。

  7.然后点击【Generate】、【Open Project】打开VS;

  8.鼠标右键选择【ALL_BUILD】,点击【生成】,然后选择【INSTALL】,点击【生成】;

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

  在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

3.在Qt中直接使用QRencode源码

3.1.添加源码

  • 将qrencode-4.1.1文件夹中除了.h、.c、config.h.in外的文件删除,文件夹也删除,qrenc.c也删除;

  • config.h.in重命名为config.h

  • 在pro文件中添加所有.h 、.c文件

  • 注意:还需要添加DEFINES += HAVE_CONFIG_H

  • 编译后会报错error: C2065: “MAJOR_VERSION”: 未声明的标识符

  • 打开config.h文件,如下图所示;

  • MAJOR_VERSIONMICRO_VERSIONMINOR_VERSIONVERSION四项修改为如下所示,与自己下载的版本号相同;

  • 然后就可以正常编译了;

3.2.用字符串生成二维码

        使用 QRcode_encodeString 或其他相关函数来生成二维码数据。这个函数会返回一个 QRcode 结构体,其中包含了二维码的像素数据。将 QRcode 结构体中的数据转换为图像格式,以便在屏幕上显示或打印出来。通常,你会遍历二维码的每个像素,并根据像素值(0 或 1)来设置图像的对应像素为黑色或白色。

void QRCodeDemo::setCodeString(const QString& strCodeString)
{m_strCodeString = strCodeString;
}void QRCodeDemo::paintEvent(QPaintEvent *event)
{QRcode *qrcode;qrcode = QRcode_encodeString(m_strCodeString.toStdString().c_str(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);if (nullptr == qrcode){return QWidget::paintEvent(event);}qint32 temp_width = ui.label->width();qint32 temp_height = ui.label->height();qint32 qrcode_width = qrcode->width > 0 ? qrcode->width : 1;double scale_x = (double)temp_width / (double)qrcode_width;double scale_y = (double)temp_height / (double)qrcode_width;//QImage mainimg = QImage(temp_width, temp_height, QImage::Format_ARGB32);m_qrcodeImage = QImage(temp_width, temp_height, QImage::Format_ARGB32);QPainter painter(&m_qrcodeImage);QColor background(Qt::white);painter.setBrush(background);painter.setPen(Qt::NoPen);painter.drawRect(0, 0, temp_width, temp_height);QColor foreground(QColor("#002266")); // 二维码颜色painter.setBrush(foreground);qDebug()<<qrcode_width<<qrcode_width;for (qint32 y = 0; y < qrcode_width; y++){for (qint32 x = 0; x < qrcode_width; x++){unsigned char b = qrcode->data[y*qrcode_width + x];if (b & 0x01){QRectF r(x*scale_x, y*scale_y, scale_x, scale_y);painter.drawRects(&r, 1);}}}ui.label->setPixmap(QPixmap::fromImage(m_qrcodeImage));return QWidget::paintEvent(event);
}void QRCodeDemo::on_pushButton_clicked()
{setCodeString(ui.lineEdit->text());
}

        保存二维码图片:

void QRCodeDemo::on_pushButton_2_clicked()
{QString path("./12334434556.jpg");m_qrcodeImage.save(path);
}

3.3.用二进制数据生成二维码

        调用 QRcode_encodeData 可以把图片或其它二进制类型的数据转换为二维码,使用起来比较简单,在这里就不多距离了。

3.4.界面设计

通过Qt Designer设计程序界面,包括:

  • 一个输入框,用于接收用户输入的内容。

  • 一个按钮,用户点击后触发二维码生成。

  • 一个显示区域,用于实时展示生成的二维码。

  • 一个按钮,用户点击后保存二维码,这个按钮是动态生成的。

3.5.效果展示

程序运行效果如下图所示:

点击保存按钮,会在当前运行目录下生成相应的二维码图片:

4.注意事项

  • 二维码无法识别:可能是由于二维码生成时参数设置不当(如版本过低、容错率过低等)或二维码图像质量不佳(如模糊、破损等)导致的。解决方案是调整参数或提高图像质量。
  • 库依赖问题:在编译或运行QRencode时可能会遇到库依赖问题。解决方案是确保系统中已安装所有必要的库文件,并使用包管理器进行管理和更新。
  • 错误处理:在实际应用中,你应该添加更多的错误处理代码,比如检查QRcode_encodeString的返回值是否为NULL,以及处理任何可能的异常或错误情况。

5.源码下载

所有代码都是在QT5.12.12版本基础上编译的。

您可以通过以下链接下载本项目的源码:

通过网盘分享的文件:CreateQrcode_new.zip
链接: https://pan.baidu.com/s/1czmd-o_0Rcp06xDvJzKcVw?pwd=ben7 提取码: ben7

参考:

1.二维码的原理竟如此简单,第一次有人说的这么明白 

相关文章:

Qt中基于开源库QRencode生成二维码(附工程源码链接)

目录 1.QRencode简介 2.编译qrencode 3.在Qt中直接使用QRencode源码 3.1.添加源码 3.2.用字符串生成二维码 3.3.用二进制数据生成二维码 3.4.界面设计 3.5.效果展示 4.注意事项 5.源码下载 1.QRencode简介 QRencode是一个开源的库&#xff0c;专门用于生成二维码&…...

Java数据结构---链表

目录 一、链表的概念和结构 1、概念 2、结构 二、链表的分类 三、链表的实现 1、创建节点类 2、定义表头 3、创建链表 4、打印链表 5、链表长度 6、看链表中是否包含key 7、在index位置插入val&#xff08;0下标为第一个位置&#xff09; 8、删除第一个关键字key …...

mongodb是怎么分库分表的

在构建高性能的数据库架构时&#xff0c;MongoDB的分库分表策略扮演着至关重要的角色&#xff0c;它通过一系列精细的步骤确保了数据的高效分布与访问。以下是对这一过程的详尽阐述&#xff0c;旨在提供一个清晰且优化过的理解框架。 确定分片键&#xff08;Shard Key&#xf…...

C++自研游戏引擎-碰撞检测组件-八叉树AABB检测算法实现

八叉树碰撞检测是一种在三维空间中高效处理物体碰撞检测的算法&#xff0c;其原理可以类比为一个管理三维空间物体的智能系统。这个示例包含两个部分&#xff1a;八叉树部分用于宏观检测&#xff0c;AABB用于微观检测。AABB可以更换为均值或节点检测来提高检测精度。 八叉树的…...

spring boot对接clerk 实现用户信息获取

在现代Web应用中&#xff0c;用户身份验证和管理是一个关键的功能。Clerk是一个提供身份验证和用户管理的服务&#xff0c;可以帮助开发者快速集成这些功能。在本文中&#xff0c;我们将介绍如何使用Spring Boot对接Clerk&#xff0c;以实现用户信息的获取。 1.介绍 Clerk提供…...

一种动态地址的查询

背景 当我们注入一个进程&#xff0c;通过函数地址进行call时经常会遇到这样的一个问题。对方程序每周四会自动更新。更新后之前的函数地址就变化了&#xff0c;然后需要重新找地址。所以&#xff0c;我就使用了一个动态查询的方式。 第一步&#xff1a;先为需要call的函数生…...

周雨彤:用角色与生活,诠释审美的艺术

提到内娱审美优秀且持续在线的女演员&#xff0c;周雨彤绝对是其中最有代表性的一个。 独树一帜的表演美学 作为新生代演员中的实力派代表&#xff0c;周雨彤凭借细腻的表演和对角色的深度共情&#xff0c;在荧幕上留下了多个令人难忘的“出圈”形象。在《我在他乡挺好的》中…...

使用jks给空apk包签名

1、在平台官方下载空的apk包&#xff08;上传应用时有提醒下载&#xff09; 2、找到jdk目录&#xff0c;比如C:\Program Files\Java\jdk1.8\bin&#xff0c;并把下载的空包apk和jks文件放到bin下 3、以管理员身份运行cmd&#xff0c;如果不是管理员会签名失败 4、用cd定位到…...

500. 键盘行 771. 宝石与石头 简单 find接口的使用

500. 键盘行1 给你一个字符串数组 words &#xff0c;只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。 请注意&#xff0c;字符串 不区分大小写&#xff0c;相同字母的大小写形式都被视为在同一行。 美式键盘 中&#xff1a; 第一行由字符 "qwer…...

仙剑世界手游新手攻略 仙剑世界能用云手机玩吗

欢迎来到《仙剑世界》手游的仙侠世界&#xff01;作为新手玩家&#xff0c;以下是一些详细的攻略和建议&#xff0c;帮助你快速上手并享受游戏的乐趣。 一、新手职业推荐 1.轩辕&#xff1a;这是一个偏辅助的职业&#xff0c;可以给队友提供输出加成等增益效果&#xff0c;不过…...

[题解]2024CCPC重庆站-小 C 的神秘图形

Sources&#xff1a;K - 小 C 的神秘图形Abstract&#xff1a;给定正整数 n ( 1 ≤ n ≤ 1 0 5 ) n(1\le n\le 10^5) n(1≤n≤105)&#xff0c;三进制字符串 n 1 , n 2 ( ∣ n 1 ∣ ∣ n 2 ∣ n ) n_1,n_2(|n_1||n_2|n) n1​,n2​(∣n1​∣∣n2​∣n)&#xff0c;按如下方法…...

NPS内网穿透SSH使用手册

1、说明 nps-一款轻量级、高性能、功能强大的内网穿透代理服务器 github地址&#xff1a;https://github.com/ehang-io/nps 官网文档地址&#xff1a;https://ehang-io.github.io/nps/#/?idnps 2、服务端 下载地址&#xff1a;https://github.com/ehang-io/nps/releases 下…...

大幂计算和大阶乘计算【C语言】

大幂计算&#xff1a; #include<stdio.h> long long int c[1000000]{0}; int main() {long long a,b,x1;c[0]1;printf("请输入底数&#xff1a;");scanf("%lld",&a);printf("请输入指数&#xff1a;");scanf("%lld",&b…...

【Linux】详谈 进程控制

目录 一、进程是什么 二、task_struct 三、查看进程 四、创建进程 4.1 fork函数的认识 4.2 2. fork函数的返回值 五、进程终止 5.1. 进程退出的场景 5.2. 进程常见的退出方法 5.2.1 从main返回 5.2.1.1 错误码 5.2.2 exit函数 5.2.3 _exit函数 5.2.4 缓冲区问题补…...

Linux top 命令

作用 top 是一个实时系统监控工具&#xff0c;用于查看系统的资源使用情况和进程状态。 示例 以下是一些常用的 top 命令示例&#xff1a; top &#xff1a;动态显示结果&#xff0c;每 3 秒刷新一次。 top -d 2&#xff1a;动态显示结果&#xff0c;每 2 秒刷新一次。 top …...

Leetcode 424-替换后的最长重复字符

给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符&#xff0c;并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。 在执行上述操作后&#xff0c;返回 包含相同字母的最长子字符串的长度。 题解 可以先做LCR 167/Leetcode 03再做本题 滑动窗口&…...

《StyleDiffusion:通过扩散模型实现可控的解耦风格迁移》学习笔记

paper&#xff1a;2308.07863 目录 摘要 1、介绍 2、相关工作 2.1 神经风格迁移&#xff08;NST&#xff09; 2.2 解耦表示学习&#xff08;DRL&#xff09; 2.3 扩散模型&#xff08;Diffusion Models&#xff09; 3、方法 3.1 风格移除模块 3.2 风格转移模块 3.3 …...

Django 创建表时 “__str__ ”方法的使用

在 Django 模型中&#xff0c;__str__ 方法是一个 Python 特殊方法&#xff08;也称为“魔术方法”&#xff09;&#xff0c;用于定义对象的字符串表示形式。它的作用是控制当对象被转换为字符串时&#xff0c;应该返回什么样的内容。 示例&#xff1a; 我在初学ModelForm时尝…...

图像处理之CSC

CSC 是 Color Space Conversion&#xff08;色彩空间转换&#xff09;的缩写&#xff0c;它涉及图像处理中的亮度、饱和度、对比度和色度等参数的调整。这些参数是图像处理中的核心概念&#xff0c;通常用于描述和操作图像的颜色信息。 以下是亮度、饱和度、对比度和色度与 CS…...

C语言数组之二维数组

C语言 主要内容 数组 二维数组 数组 二维数组 定义 二维数组本质上是一个行列式的组合&#xff0c;也就是说二维数组由行和列两部分组成&#xff0c;属于多维数组。二维数组数据是通过行列进行解读。二维数组可被视为一个特殊的一维数组&#xff0c;相当于二维数组又是一…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...