当前位置: 首页 > 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;相当于二维数组又是一…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...