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

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

前言 之前写过二维码的程序&#xff0c;但是在U盘上&#xff0c;没带&#xff0c;又重新找的网上资料写的。 网上二维码的生成&#xff0c;大多用到是第三方库libqrencode,这也一样&#xff1a; 效果图 本来是个动图的&#xff0c;都被和谐了&#xff0c;所以换成截图&…...

KDZD绝缘子表面电导盐密度测试仪

一、简介 智能电导盐密测试仪&#xff0c;也称为直读式等值盐密度测试仪&#xff0c;专为测试智能电导盐密度而设计。系统内置智能电导盐密度计算公式&#xff0c;读数直观。 人机交互采用真彩TFT液晶屏&#xff0c;操作简单&#xff0c;测试参数和结果一目了然。仪器自带微型打…...

如何降低电动汽车软件的开发成本和风险?

大多数的汽车制造商无法从销售电动汽车&#xff08;EV&#xff09;中获得利润&#xff0c;但计划快速进入市场的电动汽车初创公司是无法承担这样的损失的。 由于飙升的电池价格、高昂的组件成本和低迷的销量削弱了盈利能力&#xff0c;电动汽车初创公司必须将视线转到软件开发…...

使用pytest和allure框架实现自动化测试报告优化

目录 -x出现一条测试用例失败就退出测试 生成测试报告json pytest&#xff1a; 需要安装pytest和pytest-html(生成html测试报告&#xff09; pip install pytest 和 pip install pytest-html 命名规则 Pytest单元测试中的类名和方法名必须是以test开头,执行中只能找到test开头…...

chatGPT免费站点分享

下面的应该都能用&#xff0c;试试吧... ChatGPT是一种人工智能聊天机器人&#xff0c;能够生成虚拟语言和交互回复。使用ChatGPT&#xff0c;您可以与机器人进行真实的交互&#xff0c;让机器人根据您提出的问题或请求来生成回复。但是&#xff0c;在使用ChatGPT时&#xff0…...

【计算机网络】已知一个/27网络中有一个地址是 167.199.170.82,问这个网络的网络掩码,网络前缀长度和网络后缀长度是多少?网络前缀是多少?

目录 题&#xff1a; 1. 网络掩码 2.网络前缀长度 3.网络前缀 4.网络后缀长度 题&#xff1a; 已知一个/27网络中有一个地址是 167.199.170.82&#xff0c; 问这个网络的网络掩码&#xff0c;网络前缀长度和网络后缀长度是多少&#xff1f;网络前缀是多少&#xff1f; 1.…...

Java8 - Stream

介绍 Java8中有两大最为重要的改变。第一个是 Lambda 表达式; 另外一个则是 Stream API(java.util.stream.*)。Stream是 Java8中处理集合的关键抽象概念&#xff0c;它可以指定你希望对集合进行的操作&#xff0c;可以执行非常复杂的查找、过滤和映射数据等操作。使用 Stream …...

什么样的冷链保温箱,既环保又实用?

冷链物流运输已经应用在了很多行业中&#xff0c;作为冷链物流运输中的重要设备——冷链保温箱&#xff0c;起到了举足轻重的作用。如果选择不当&#xff0c;选到了劣质产品&#xff0c;尤其是化学行业或者食品行业&#xff0c;就有可能造成试剂失效或者是影响粮食食品安全问题…...

Eclipse的介绍与安装

Eclipse简介 Eclipse 是一个开放源代码的&#xff0c;基于 Java 的可扩展开发平台。Eclipse官方版是一个集成开发环境(IDE)&#xff0c;可以通过安装不同的插件实现对其它计算机语言编辑开发&#xff0c;如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查看方法&#xff08;暂不完整&#xff09;4.1 根据hosts文件确认IP对应的别名4.2 根据serviceIP确认Persis…...

AMB300系列母线槽红外测温解决方案某锂电厂房项目案例分享

安科瑞 耿敏花 一、 行业背景 近年来&#xff0c;在国家政策引导与技术革新驱动的双重作用下&#xff0c;锂电产业保持快速增长态势&#xff0c;产业规模持续扩大&#xff0c;同时新能源产业工厂锂电池生产线对于电的依赖性很高&#xff0c;因而对供电设备的可靠性提出…...

go语言学习——4

文章目录 Map Map map是一种特殊的数据结构&#xff1a;一种元素对pair的无序集合&#xff0c;pair的一个元素是key&#xff0c;对应一个value&#xff0c;这种结构也称为“关联数组或字典”引用类型 map声明 var map1 map[keytype] valuetype var map1 map[string] intmap可以…...

vulnhub-RAVEN:2(MYSQL-UDF提权,手工提权/工具自动提权)

镜像下载&#xff1a;Raven: 2 ~ VulnHub 实验环境&#xff1a;kali&#xff1a;192.168.78.128 vulnhub镜像&#xff1a;192.168.78.133 1、kali查看本地ip地址&#xff0c;以便使用nmap扫描ip段存活主机 2、nmap扫描IP段&#xff0c;发现靶机的IP地址为192.168.78.133 4、访问…...

如何完整地掌握一个机器学习模型

如何完整地掌握一个机器学习模型 要全面地学习、掌握一个机器学习模型&#xff0c;可以遵循以下步骤&#xff1a; 基础理论学习&#xff1a;了解该模型的背后数学原理和推导过程&#xff0c;包括假设、损失函数、优化方法等。 学习算法实现&#xff1a;通过查阅论文、教程或…...

Nevron Open Vision for .NET 2022.3 Crack

Nevron Open Vision for .NET 适用于 Blazor、WPF、WinForms 和 Xamarin.Mac 的领先用户界面组件 Nevron Open Vision for .NET 是一套高级 UI 组件&#xff0c;可帮助您从单个代码库开发功能丰富的 Web &#xff08;Blazor WebAssembly&#xff09; 和桌面 &#xff08;WinFor…...

【Linux】冯诺依曼体系结构以及操作系统的初步认知

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;Linux的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、冯诺依曼体系结构二、操…...

盖雅工场重磅发布「劳动力账户」,助力企业实现全面工时成本管理

2023年5月10日&#xff0c;亚太地区领先的劳动力管理云服务商盖雅工场宣布&#xff0c;在原有的智能排班和实时考勤系统基础之上&#xff0c;正式推出全新模块「劳动力账户」&#xff0c;通过为企业里的每一位员工建立劳动力账户&#xff0c;实现工时与成本的全面管控&#xff…...

数据结构与算法基础(青岛大学-王卓)(2)

第二弹火爆来袭中 这波是单链表的内容整理&#xff0c;废话不多说&#xff0c;上小龙虾呀(又到了龙虾季节了&#xff0c;哎&#xff0c;口水直流了~~) beautiful的分割线 文章目录 第二弹火爆来袭中这波是单链表的内容整理&#xff0c;废话不多说&#xff0c;上小龙虾呀(又到了…...

水产亚硝酸盐偏高解决办法,饮用水亚硝酸盐超标

使用常规的离子交换树脂处理含硫酸盐水中的硝酸盐是困难的。因为树脂几乎交换了水中的所有的硫酸盐后&#xff0c;才与水中的硝酸盐交换。也就是说&#xff0c;硫酸盐的存在会降低树脂对硝酸盐的去除能力。采用Tulsimer A-62MP除硝酸盐树脂优先交换硝酸盐&#xff0c;对硝酸盐的…...

linux 设备树详解

设备树 描述设备树的文件叫做 DTS(Device Tree Source)&#xff0c;这个 DTS 文件采用树形结构描述板级设备&#xff0c;也就是开发板上的设备信息&#xff0c;比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。 树的主干就是系统总线&#x…...

STM32 学习笔记_7 定时器中断:输出比较

输出比较 电机相关比较重要。 OC Output Compare&#xff08;IC 是输入捕获&#xff0c;CC代指这两个单元&#xff09;&#xff0c;用于输出一定频率和占空比的PWM波形。 右下角四个就是CCR。只有通用计时器和高级计时器有&#xff0c;共用一个cnt计数器&#xff0c;高级计数…...

HTML购物车示例(勾选、删除、添加和结算功能)

以下是一个简单的HTML购物车示例&#xff0c;包含勾选、删除、添加和结算功能。结算功能使用PHP实现&#xff0c;可以获取选中商品的ID。 以下是一个简单的HTML购物车示例&#xff0c;包含勾选、删除、添加和结算功能。结算功能使用PHP实现&#xff0c;可以获取选中商品的ID以下…...

MySQL原理(十):主从架构

前言 上一篇介绍了 MySQL 的表分区和分库分表&#xff0c;这一篇将介绍主从架构相关的内容。 主从架构 常见的主从架构模式有四种&#xff1a; 一主多从架构&#xff1a;适用于读大于写的场景&#xff0c;采用多个从库来分担数据库系统的读压力。多主架构&#xff1a;适用于…...

一文了解Moonbeam智能合约

智能合约&#xff1a;区块链交易的基石 20世纪90年代&#xff0c;Nick Szabo首次提出智能合约的概念&#xff0c;这是一个建立在自动化、加密安全世界之上的数字化市场。在这种数字化市场中&#xff0c;交易和业务可以在无需信任的情况下进行&#xff0c;无需中间人。 以太坊…...

【加解密篇】利用HashCat破解RAR压缩包加密文件详细教程

【加解密篇】利用HashCat解密RAR压缩包加密文件 在取证知识里挖呀挖呀挖—【蘇小沐】 文章目录 【加解密篇】利用HashCat解密RAR压缩包加密文件1.实验环境2.RAR加密压缩包 &#xff08;一&#xff09;john软件1.使用CMD命令&#xff1a; run\rar2john.exe &#xff08;二&…...

React面试题汇总1

1.React的严格模式如何使用&#xff0c;有什么用处&#xff1f; React中StrictMode严格模式_react.strictmode_前端精髓的博客-CSDN博客当我们使用 npx create-react-app my-app 创建一个项目的时候。项目中有一段如下所示的代码&#xff1a;ReactDOM.render( <React.Stric…...

Golang每日一练(leetDay0066) 有效电话号码、转置文件

目录 193. 有效电话号码 Valid Phone Numbers &#x1f31f; 194. 转置文件 Transpose File &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 193. 有效电话号…...

前端 之 FormData对象浅谈

一、简介 ​ 通常情况下&#xff0c;前端在使用post请求提交数据的时候&#xff0c;请求都是采用application/json 或 application/x-www-form-urlencoded编码类型&#xff0c;分别是借助JSON字符串来传递参数或者keyvalue格式字符串&#xff08;多参数通过&进行连接&…...

【分布式锁】Redisson分布式锁的使用(推荐使用)

文章目录 前言一、常见分布式锁方案对比二、分布式锁需满足四个条件三、什么是Redisson?官网和官方文档Redisson使用 四、Redisson 分布式重入锁用法Redisson 支持单点模式、主从模式、哨兵模式、集群模式自己先思考下,如果要手写一个分布式锁组件&#xff0c;怎么做&#xff…...

创建XML的三种方式(二)

文章目录 1 使用XmlDocument创建XML文档2 使用XmlTextWriter写XML文档3 使用LINQ to XML 的XDocument类4 小结 本文介绍了在winform中使用C#开发语言来创建XML文档的三种方式&#xff0c;并介绍了各自的优缺点。 方法1是使用 XmlDocument创建XML文档&#xff0c;方法2是使用 …...