Qt libqrencode二维码——QtWidgets
前言
之前写过二维码的程序,但是在U盘上,没带,又重新找的网上资料写的。
网上二维码的生成,大多用到是第三方库libqrencode,这也一样:
效果图
本来是个动图的,都被和谐了,所以换成截图,而且还打码了。效果是二维码放在一个对话框里,可以移动,但是不可关闭,得靠代码逻辑控制关闭。

参考
主要参考下面的博客,这个作者写的很详细,给了第三库的下载路径,编译和使用示例,我在其基础上对二维码的显示形式进行了点修改,使其更为符合我的项目要求。
Qt + libqrencode 生成二维码_龚建波的博客-CSDN博客
犹豫担心后面此文章链接失效,所以我还是对其进行了简单的记录。
libqrencode地址
官网地址:
libqrencode
我是在github上下载的源码:GitHub - fukuchi/libqrencode: A fast and compact QR Code encoding library
cmake编译libqrencode

使用代码
自己封装了一个类QRCodeDialog,用来显示二维码(对话框),在参考博客代码的基础上进行了一些更改,比如二维码大小根据控件大小调整,二维码形状为正方形等,具体代码如下(ps:这里只特别浅显的使用了一下,具体关于库libqrencode的api并没有学习):
主要是用到了libqrencode里的函数
/**** QRcode_encodeString 从字符串创建一个符号。库自动解析输入字符串并在二维码符号中编码.* @warning 禁用pthread时线程不安全.* @param string NUL('\0')结尾的C字符串.* @param version 符号版本.越大可容纳的信息越多.0则按实际内容确定* @param level 纠错等级,枚举.* @param hint 编码模式,utf8用QR_MODE_8.* @param casesensitive 区分大小写(1) 不区分(0).* @return 返回QRcode类的实例。结果QRcode的版本可能是大于指定的版本.* 出现错误时,返回NULL,设置errno以指示错误.* @throw EINVAL invalid input object.* @throw ENOMEM unable to allocate memory for input objects.* @throw ERANGE input data is too large.*/
QRcode *QRcode_encodeString(const char *string, int version, QRecLevel level, QRencodeMode hint, int casesensitive);
.h 文件
#ifndef QRCODEDIALOG_H
#define QRCODEDIALOG_H#include <QDialog>
#include <QResizeEvent>
#include"qrencode.h"
#include<QMouseEvent>namespace Ui {
class QRCodeDialog;
}class QRCodeDialog : public QDialog
{Q_OBJECTpublic:explicit QRCodeDialog(QWidget *parent = 0);~QRCodeDialog();/*** @brief setQRCodeInfo 设置二维码信息* @param info 内容* @param casesensitive 区分大小写(1) 不区分(0).*/void setQRCodeInfo(const QString& info, int casesensitive = 1);protected:void resizeEvent(QResizeEvent* event)override;...private:QImage qrEncode(const QString& info, int casesensitive = 1);private:Ui::QRCodeDialog *ui;QString m_strInfo;int m_iCasesensitive;...
};#endif // QRCODEDIALOG_H
.cpp文件
#include "QRCodeDialog.h"
#include "ui_QRCodeDialog.h"#include <QPainter>
#include<QDebug>QRCodeDialog::QRCodeDialog(QWidget *parent) :QDialog(parent),ui(new Ui::QRCodeDialog),m_iCasesensitive(1)
{ui->setupUi(this);setModal(true);setWindowFlags(Qt::FramelessWindowHint | Qt::Tool|windowFlags());ui->label->setAlignment(Qt::AlignCenter);}QRCodeDialog::~QRCodeDialog()
{delete ui;
}void QRCodeDialog::setQRCodeInfo(const QString &info, int casesensitive)
{m_strInfo=info;m_iCasesensitive=casesensitive;
}void QRCodeDialog::resizeEvent(QResizeEvent *event)
{if(!m_strInfo.isEmpty()){QImage img = qrEncode(m_strInfo,m_iCasesensitive);QPixmap pix=QPixmap::fromImage(img);int width=qMin(ui->label->width(),ui->label->height());pix=pix.scaled(width,width);//ui->label->setPixmap(QPixmap::fromImage(img));ui->label->setPixmap(pix);}QDialog::resizeEvent(event);
}QImage QRCodeDialog::qrEncode(const QString &info, int casesensitive)
{QImage ret; //放二维码图片结果int scale = 4; //方块绘制大小QByteArray info_data = info.toUtf8();QRcode* qr = QRcode_encodeString(info_data.constData(), 0, QR_ECLEVEL_Q, QR_MODE_8, casesensitive);if (qr && qr->width > 0){int img_width = qr->width * scale;ret = QImage(img_width, img_width, QImage::Format_Mono); //mono位图QPainter painter(&ret);painter.fillRect(0, 0, img_width, img_width, Qt::white);//背景填充白色painter.setPen(Qt::NoPen);painter.setBrush(Qt::red); //黑色方块for (int y = 0; y < qr->width; y++) //行{for (int x = 0; x < qr->width; x++) //列{if (qr->data[y * qr->width + x] & 1) //1表示黑块{QRect r(x * scale, y * scale, scale, scale);painter.drawRect(r);}}}QRcode_free(qr);}return ret;
}
上面绘制的是黑白色,若是想改变颜色当然也是可以的:
调整QImage的格式,上面代码用的是QImage::Format_Mono,即为通常所讲的位图模式,若是此模式下,即使改变QPainter刷子的颜色,也是无法改变绘制的方块颜色,所以这里改一下
ret = QImage(img_width, img_width,QImage::Format_RGB32 );
修改背景颜色:
painter.fillRect(0, 0, img_width, img_width,QColor(167,220,237));
修改方块的颜色
painter.setBrush(Qt::blue);
最终效果是这样的:

结束语
记录一下吧,省的又忘了。
相关文章:
Qt libqrencode二维码——QtWidgets
前言 之前写过二维码的程序,但是在U盘上,没带,又重新找的网上资料写的。 网上二维码的生成,大多用到是第三方库libqrencode,这也一样: 效果图 本来是个动图的,都被和谐了,所以换成截图&…...
KDZD绝缘子表面电导盐密度测试仪
一、简介 智能电导盐密测试仪,也称为直读式等值盐密度测试仪,专为测试智能电导盐密度而设计。系统内置智能电导盐密度计算公式,读数直观。 人机交互采用真彩TFT液晶屏,操作简单,测试参数和结果一目了然。仪器自带微型打…...
如何降低电动汽车软件的开发成本和风险?
大多数的汽车制造商无法从销售电动汽车(EV)中获得利润,但计划快速进入市场的电动汽车初创公司是无法承担这样的损失的。 由于飙升的电池价格、高昂的组件成本和低迷的销量削弱了盈利能力,电动汽车初创公司必须将视线转到软件开发…...
使用pytest和allure框架实现自动化测试报告优化
目录 -x出现一条测试用例失败就退出测试 生成测试报告json pytest: 需要安装pytest和pytest-html(生成html测试报告) pip install pytest 和 pip install pytest-html 命名规则 Pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开头…...
chatGPT免费站点分享
下面的应该都能用,试试吧... ChatGPT是一种人工智能聊天机器人,能够生成虚拟语言和交互回复。使用ChatGPT,您可以与机器人进行真实的交互,让机器人根据您提出的问题或请求来生成回复。但是,在使用ChatGPT时࿰…...
【计算机网络】已知一个/27网络中有一个地址是 167.199.170.82,问这个网络的网络掩码,网络前缀长度和网络后缀长度是多少?网络前缀是多少?
目录 题: 1. 网络掩码 2.网络前缀长度 3.网络前缀 4.网络后缀长度 题: 已知一个/27网络中有一个地址是 167.199.170.82, 问这个网络的网络掩码,网络前缀长度和网络后缀长度是多少?网络前缀是多少? 1.…...
Java8 - Stream
介绍 Java8中有两大最为重要的改变。第一个是 Lambda 表达式; 另外一个则是 Stream API(java.util.stream.*)。Stream是 Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用 Stream …...
什么样的冷链保温箱,既环保又实用?
冷链物流运输已经应用在了很多行业中,作为冷链物流运输中的重要设备——冷链保温箱,起到了举足轻重的作用。如果选择不当,选到了劣质产品,尤其是化学行业或者食品行业,就有可能造成试剂失效或者是影响粮食食品安全问题…...
Eclipse的介绍与安装
Eclipse简介 Eclipse 是一个开放源代码的,基于 Java 的可扩展开发平台。Eclipse官方版是一个集成开发环境(IDE),可以通过安装不同的插件实现对其它计算机语言编辑开发,如C、Php、Python等等。 Eclipse的下载 下载时需要访问网址 http://…...
<IBM AIX> 《AIX中HA的网卡IP确认方法》
《HA网卡确认方法》 1 HA IP地址类型2HA IP地址设置原则3 HA网卡日常查看方法3.1 查看hosts文件3.2 查看网卡和IP 4 通过命令方式直接查看5 直接查看HA配置4 HA网卡SMIT查看方法(暂不完整)4.1 根据hosts文件确认IP对应的别名4.2 根据serviceIP确认Persis…...
AMB300系列母线槽红外测温解决方案某锂电厂房项目案例分享
安科瑞 耿敏花 一、 行业背景 近年来,在国家政策引导与技术革新驱动的双重作用下,锂电产业保持快速增长态势,产业规模持续扩大,同时新能源产业工厂锂电池生产线对于电的依赖性很高,因而对供电设备的可靠性提出…...
go语言学习——4
文章目录 Map Map map是一种特殊的数据结构:一种元素对pair的无序集合,pair的一个元素是key,对应一个value,这种结构也称为“关联数组或字典”引用类型 map声明 var map1 map[keytype] valuetype var map1 map[string] intmap可以…...
vulnhub-RAVEN:2(MYSQL-UDF提权,手工提权/工具自动提权)
镜像下载:Raven: 2 ~ VulnHub 实验环境:kali:192.168.78.128 vulnhub镜像:192.168.78.133 1、kali查看本地ip地址,以便使用nmap扫描ip段存活主机 2、nmap扫描IP段,发现靶机的IP地址为192.168.78.133 4、访问…...
如何完整地掌握一个机器学习模型
如何完整地掌握一个机器学习模型 要全面地学习、掌握一个机器学习模型,可以遵循以下步骤: 基础理论学习:了解该模型的背后数学原理和推导过程,包括假设、损失函数、优化方法等。 学习算法实现:通过查阅论文、教程或…...
Nevron Open Vision for .NET 2022.3 Crack
Nevron Open Vision for .NET 适用于 Blazor、WPF、WinForms 和 Xamarin.Mac 的领先用户界面组件 Nevron Open Vision for .NET 是一套高级 UI 组件,可帮助您从单个代码库开发功能丰富的 Web (Blazor WebAssembly) 和桌面 (WinFor…...
【Linux】冯诺依曼体系结构以及操作系统的初步认知
🏖️作者:malloc不出对象 ⛺专栏:Linux的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言一、冯诺依曼体系结构二、操…...
盖雅工场重磅发布「劳动力账户」,助力企业实现全面工时成本管理
2023年5月10日,亚太地区领先的劳动力管理云服务商盖雅工场宣布,在原有的智能排班和实时考勤系统基础之上,正式推出全新模块「劳动力账户」,通过为企业里的每一位员工建立劳动力账户,实现工时与成本的全面管控ÿ…...
数据结构与算法基础(青岛大学-王卓)(2)
第二弹火爆来袭中 这波是单链表的内容整理,废话不多说,上小龙虾呀(又到了龙虾季节了,哎,口水直流了~~) beautiful的分割线 文章目录 第二弹火爆来袭中这波是单链表的内容整理,废话不多说,上小龙虾呀(又到了…...
水产亚硝酸盐偏高解决办法,饮用水亚硝酸盐超标
使用常规的离子交换树脂处理含硫酸盐水中的硝酸盐是困难的。因为树脂几乎交换了水中的所有的硫酸盐后,才与水中的硝酸盐交换。也就是说,硫酸盐的存在会降低树脂对硝酸盐的去除能力。采用Tulsimer A-62MP除硝酸盐树脂优先交换硝酸盐,对硝酸盐的…...
linux 设备树详解
设备树 描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。 树的主干就是系统总线&#x…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
