使用QT生成二维码的两种方式

目录

  • 使用QRenCode生成二维码
    • 编译生成QRenCode库
    • 使用QRenCode
    • 结果演示
    • 优缺点:
  • 使用QZXing进行二维码的编码和解码
    • 编译源码
    • 使用QZXing库
    • 运行结果
    • 优缺点

使用QRenCode生成二维码

编译生成QRenCode库

QRenCode开源库

下载好之后使用cmake-gui打开进行构建生成。
在这里插入图片描述点击configure选择编译器和平台,我这里选择vs2022+x64

在这里插入图片描述

点击"Add Entry",Name填写CMAKE_DEBUG_POSTFIX,Type选择string,value填写d,表示生成debug时带有d后缀

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
勾选这两个地方,点击generate

这是生成后的内容:

在这里插入图片描述
使用vs打开进行生成,右键install生成

在这里插入图片描述这是生成路径,debug和release都生成。

在这里插入图片描述之后在这个生成路径下会找到头文件、动态库和静态库。

在这里插入图片描述在这里插入图片描述

使用QRenCode

使用qt creator新建一个项目,然后将刚刚的动态库、静态库、头文件拷贝到这个项目中

在这里插入图片描述
.pro文件添加以下内容:

DEFINES += QT_DEPRECATED_WARNINGS HAVE_CONFIG_H

HEADERS += \
        mainwindow.h \
    qrencode.h
    
LIBS += -L$$PWD/ -lqrencoded

ui文件我是这样布局的

在这里插入图片描述encode按钮是编码,decode是解码,但是qrencode生成的二维码貌似不能对其解码,不过可以使用QZXing库进行编码和解码,在下面会讲到。

// encode按钮槽函数,生成二维码
void MainWindow::on_pushButton_clicked()
{
    QString strUrl = ui->textEdit->toPlainText();

    QRcode *qrcode;
    qrcode = QRcode_encodeString(strUrl.toStdString().c_str(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);

    qint32 temp_width = 500;
    qint32 temp_height = 500;
    qDebug() << "temp_width=" << temp_width << ";temp_height=" << temp_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;

    int offset = 14;
    QImage mainimg = QImage(temp_width + offset * 2, temp_height + offset * 2, QImage::Format_ARGB32);
    QPainter painter(&mainimg);
    QColor background(Qt::white);
    painter.setBrush(background);
    painter.setPen(Qt::NoPen);
    painter.drawRect(offset, offset, temp_width, temp_height);
    // 设置二维码颜色为蓝色
    QColor foreground(Qt::blue);
    painter.setBrush(foreground);

    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(offset + x * scale_x, offset + y * scale_y, scale_x, scale_y);
                painter.drawRects(&r, 1);
            }
        }
    }

    painter.setPen( QColor(0, 0, 255));
    painter.drawText(temp_width/2, temp_height+offset*2-2, strUrl);
    QPixmap mainmap = QPixmap::fromImage(mainimg);

    QLabel* m_pQrlabel = new QLabel();
    m_pQrlabel->setWindowFlags(Qt::WindowCloseButtonHint);
    m_pQrlabel->setAttribute(Qt::WA_QuitOnClose, false);
    m_pQrlabel->setPixmap(mainmap);
    m_pQrlabel->setVisible(true);
    m_pQrlabel->setToolTip(strUrl);
    m_pQrlabel->setWindowTitle("本地生成二维码:" + strUrl);
    
    // 保存二维码
    mainmap.save(QCoreApplication::applicationDirPath() + "\\qrcode_local.jpg",Q_NULLPTR, 100);
}

结果演示

随便输入一段内容,点击encode按钮进行生成,会生成一个二维码,这个二维码使用微信的扫一扫也可以扫描出内容。

在这里插入图片描述

优缺点:

  • 可以自定义二维码背景、颜色
  • 这种方式目前只能对文本生成二维码,图片、文档、音频这种我还没找到方法,欢迎大家指导
  • 这种方式貌似不能对生成的二维码进行解码

使用QZXing进行二维码的编码和解码

编译源码

QZXing源码链接

在这里插入图片描述

使用qt creator打开src里的.pro进行构建,我这边的环境是Qt 5.9.1 + msvc2017_x64构建可以成功,msvc2015_x64失败。

分别选择debug和release进行构建,会生成对应的动态库和静态库。

使用QZXing库

使用Qt Creator新建一个项目,然后将生成的动态库和静态库拷贝到项目目录下,头文件选择这两个,这里使用debug的动态库进行演示。

在这里插入图片描述
我的工程目录:
在这里插入图片描述

在.pro文件添加

DEFINES += QT_DEPRECATED_WARNINGS QZXING_LIBRARY
DEFINES += ENABLE_ENCODER_GENERIC

LIBS += -L$$PWD/QZXingDebug/ -lQZXing3

DEPENDPATH += $$PWD

HEADERS += \
        mainwindow.h \
        QZXing.h \
        QZXing_global.h

ui文件这样布局
在这里插入图片描述
其中encode按钮是生成二维码,decode是对二维码进行解码。

包含头文件

#include "QZXing.h"
// encode按钮槽函数,编码生成二维码
void MainWindow::on_pushButton_clicked()
{
    img = QZXing::encodeData(ui->textEdit->toPlainText(),
                                     QZXing::EncoderFormat_QR_CODE);
    ui->label->setPixmap(QPixmap::fromImage(img));
}

// decode按钮槽函数,对二维码解码
void MainWindow::on_pushButton_2_clicked()
{
    if(img.isNull())
        return;
    QZXing decoder;
    //QR Code二维码
    decoder.setDecoder(QZXing::DecoderFormat_QR_CODE);
    //可选设置,赋值自文档demo
    decoder.setSourceFilterType(QZXing::SourceFilter_ImageNormal);
    decoder.setTryHarderBehaviour(QZXing::TryHarderBehaviour_ThoroughScanning |
                                  QZXing::TryHarderBehaviour_Rotate);
    QString info = decoder.decodeImage(img);
    ui->textEdit->setPlainText("decode:" + info);
}

运行结果

生成二维码,二维码的大小可以控制,默认是240*240,参数设置在这个函数,其他参数貌似没什么用,可以使用微信扫一扫扫描。

QZXing::encodeData()

在这里插入图片描述
对二维码进行解码

在这里插入图片描述

优缺点

  • 不能设置背景和颜色
  • 可以对生成的二维码进行解码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/671029.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mathtype7.0产品密钥及2024最新软件激活教程步骤

在数字化教育日益普及的今天&#xff0c;如何有效利用技术工具来提高数学学习的效率和质量&#xff0c;成为了教育工作者和学生共同关注的热点。特别是在处理复杂的数学公式、符号以及方程式时&#xff0c;传统的输入方式往往费时费力&#xff0c;且容易出错。为此&#xff0c;…

如何用python做一个用户登录界面——浔川python社

1 需解决的问题&#xff1a; 1.1如何用python做一个用户登录界面&#xff1f; 1.2需要用到哪些库、模块&#xff1f; 2 问题解决&#xff1a; 2.1 回答 1.1 &#xff1a;合理即可&#xff0c;无标准回答。 2.2 回答 1.2 &#xff1a;tk库&#xff08;缩写&#xff09;、GUL界面…

redis基础学习

redis是一个键值对类型的NoSql类型的数据库。 NoSql&#xff08;Non-relational SQL的缩写&#xff0c;也有人看作是not only sql的缩写&#xff09;型数据库&#xff0c;具有以下特征&#xff1a; 1、非结构化&#xff1a;几乎没有约束&#xff0c;约束很少&#xff0c;这要看…

【LLM】两篇多模态LLM综述MultiModal Large Language Models

note &#xff08;一&#xff09;现有的 MM-LLM 的趋势&#xff1a; (1)从专门强调 MM 理解对特定模态的生成的进展&#xff0c;并进一步演变为任何到任何模态的转换&#xff08;例如&#xff0c;MiniGPT-4 → MiniGPT-5 → NExT-GPT&#xff09;&#xff1b; (2) 从 MM PT 提…

神经网络与深度学习——第7章 网络优化与正则化

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第7章 网络优化与正则化 网络优化与正则化 网络优化 网络结构多样性 高维变量的非凸优化 神经网络优化的改善方法 优化算法 小批量梯度下降 批量大小选择 学习率调整 学习率衰减 学习率预热 周期性学习率调…

装甲车启动电源的安全性能分析

装甲车辆启动电源是一种为装甲车辆提供启动动力的专业设备。它通常被用于 火箭兵 、步兵战车、装甲运兵车等JS车辆&#xff0c;这些车辆通常需要较高的启动功率来启动其发动机&#xff0c;尤其是装甲车的发动机&#xff0c;由于其功率大&#xff0c;启动对电力要求很高。在现代…

3DMAX一键虚线图形插件DashedShape使用方法

3DMAX一键虚线图形插件使用方法 3dMax一键虚线图形插件&#xff0c;允许从场景中拾取的样条线创建虚线形状。该工具使你能够创建完全自定义的填充图案&#xff0c;为线段设置不同的材质ID&#xff0c;并在视口中进行方便的预览。 【版本要求】 3dMax 2012 – 2025&#xff08;…

HarmonyOS应用开发学习历程(1)初识DevEco Studio

1.create project Bundle name&#xff1a;包名&#xff0c;标识应用程序&#xff0c;默认应用ID也使用该名 Compile SDK&#xff1a;编译时API版本 2.工程目录 AppScope&#xff1a;应用全局所需资源 entry&#xff1a;应用的主模块&#xff0c;含代码、资源 hvigor&#…

Java多线程问题

线程 何为线程&#xff1a;线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源&#xff0c;但每个线程有自己的程序计数器、虚拟机栈和本地方法栈&#xff0c;所以系统在产生一个线程&#xf…

OSEK错误处理及跟踪调试

1 前言 如表1所示&#xff0c;OSEK提供了一些特殊的钩子例程&#xff08;Hook routines&#xff09;&#xff0c;应用层可以在钩子函数中自定义操作&#xff0c;以参与到操作系统的内部处理中。 表1 钩子函数类型 钩子函数例程功能用途ErrorHook用于错误处理StartupHook在系统启…

【论文复现|智能算法改进】基于多策略麻雀搜索算法的机器人路径规划

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.改进点 改进的无限折叠迭代混沌映射 无限折叠迭代映射(ICMIC) 常用于图像加密方向的研究, 基本思想是首先生成[0,1]之间的混沌序列, …

【Qt秘籍】[008]-Qt中的connect函数

在Qt框架中&#xff0c;connect函数是一个非常核心的函数&#xff0c;用于实现信号&#xff08;Signals&#xff09;和槽&#xff08;Slots&#xff09;之间的连接&#xff0c;它是Qt信号槽机制的关键所在。信号槽机制是一种高级的通信方式&#xff0c;允许对象在状态改变时通知…

掘金AI 商战宝典-系统班:2024掘金AIGC课程(30节视频课)

课程目录 1-第一讲学会向Al提问&#xff1a;万能提问公式_1.mp4 2-第二讲用AI写视频脚本_1.mp4 3-第三讲用AI写视频口播文案_1.mp4 4-第四讲用AI自动做视频&#xff08;上&#xff09;_1.mp4 5-第五讲用AI自动做视频&#xff08;中&#xff09;_1.mp4 6-第六讲用AI自动做视…

1. Mybatis基础操作

目录 1.1 需求 1.2 准备 1.3 删除 1.3.1 功能实现 1.3.2 日志输入 1.3.3 预编译SQL 1.3.3.1 介绍 1.3.3.2 SQL注入 1.3.3.3 参数占位符 1.4 新增 1.4.1 基本新增 1.4.2 主键返回 1.5 更新 1.6 查询 1.6.1 根据ID查询 1.6.2 数据封装 1.6.3 条件查询 1.6.4 参…

Tree——输出项目的文件结构(Linux)

输出项目中的文件结构可以使用tree命令。tree是一个用于以树状结构显示目录内容的命令行工具。它非常适合快速查看项目的文件结构。安装&#xff1a; sudo apt-get install tree 使用&#xff1a; 在命令行中导航到项目的根目录&#xff0c;输出文件结构。 tree 也可以将结构输…

NXP RT1060学习总结 - CANFD功能

1、RT1060-CAN FD功能简介 这里使用RT1060系列的1064芯片进行开发&#xff0c;测试板是官方提供的开发板&#xff1b;RT1060系列支持3路CAN功能&#xff0c;CAN1和CAN2只能最为普通的CAN外设&#xff0c;支持CAN2.0&#xff0c;而CAN3支持CAN-FD功能&#xff1b;CAN-FD功能这里…

数据库概念

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

Java学习Lambda表达式

Lambda表达式 有且只有一个未实现的方法叫做Lambda表达式&#xff0c;可以实现函数式编程 // 这个注解是用来检查你写的函数是否是函数式接口 FunctionalInterfaceinterface Myinterface {int sum(int a, int b);default String priteTitle(String name, int age, String sex)…

<Rust><iced>基于rust使用iced库构建GUI实例:动态改变主题色

前言 本专栏是Rust实例应用。 环境配置 平台&#xff1a;windows 软件&#xff1a;vscode 语言&#xff1a;rust 库&#xff1a;iced、iced_aw 概述 本篇构建了这样的一个实例&#xff0c;可以动态修改UI的主题&#xff0c;通过菜单栏来选择预设的自定义主题和官方主题&#…

1+X Web应用软件测试(中级) 考试失利教训

考证考试结束的第二天复盘 复盘时间:2024/6/2 9:45-10:00 考试名称:1X Web应用软件测试(中级) 电子书:Web应用软件测试&#xff08;中级&#xff09; 他人备考技巧 改进: [考前策略]自动化40性能40功能2个20 1.可以2人分工合作,完成一整套功能测试题目 2.制定阶段时间的学…