Qt-qrencode开发-生成二维码

1、概述

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

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

库的基本特性

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

开发环境说明

  • 系统:Windows11、Ubuntu20.04
  • Qt版本:V5.14.2
  • 编译器:MSVC2017-64、GCC/G++64
  • qrencode版本:4.1.1

2、实现效果

  1. 将qrencode使用Qt封装为一个生成、显示二维码的控件;
  2. 支持使用QPainter绘制显示二维码;
  3. 可通过函数接口返回生成的二维码QImage;
  4. 可通过调用函数将生成的二维码保存到指定路径;
  5. 支持使用源码嵌入工程(更好的跨平台、支持各种编译器);
  6. 支持使用编译好的静态库(MSVC2017-64);

3、编译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. 就可以在安装路径下生成编译好的文件了;

4、在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

5、在Qt中直接使用QRencode源码

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

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

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

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

    DEFINES += HAVE_CONFIG_H
    SOURCES += \
    main.cpp \
    qrencode/bitstream.c \
    qrencode/mask.c \
    qrencode/mmask.c \
    qrencode/mqrspec.c \
    qrencode/qrencode.c \
    qrencode/qrinput.c \
    qrencode/qrspec.c \
    qrencode/rsecc.c \
    qrencode/split.c \
    widget.cpp HEADERS += \
    qrencode/bitstream.h \
    qrencode/config.h \
    qrencode/mask.h \
    qrencode/mmask.h \
    qrencode/mqrspec.h \
    qrencode/qrencode.h \
    qrencode/qrencode_inner.h \
    qrencode/qrinput.h \
    qrencode/qrspec.h \
    qrencode/rsecc.h \
    qrencode/split.h \
    widget.h
  • 编译后会报错error: C2065: “MAJOR_VERSION”: 未声明的标识符

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

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

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

6、在Qt中使用QRencode生成二维码示例

  • 在ui文件中添加下列控件,并将QWidget提升为QrCodeView

  • 实现代码

    #include "qrcodeview.h"
    #include "qrencode.h"
    #include <QDebug>
    #include <QDir>
    #include <QFileInfo>
    #include <QPainter> QrCodeView::QrCodeView(QWidget* parent)
    : QWidget{parent}
    {} void QrCodeView::setString(const QString& str)
    {
    if (str.isEmpty())
    return;
    if (m_str == str)
    return;
    m_str = str; QRcode* qrcode = QRcode_encodeString(str.toStdString().data(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);
    if (!qrcode) // 错误返回null
    {
    qInfo() << errno; // 打印错误码
    return;
    } int w = qMin(this->width(), this->height()); // 控件长宽的最小值,保证绘制完整正方形
    int qrcodeW = qMax(qrcode->width, 1);
    qreal size = w / qreal(qrcodeW); // 二维码小格子的长宽 m_img = QImage(w, w, QImage::Format_ARGB32);
    QPainter painter(&m_img);
    painter.setBrush(Qt::white); // 设置白色笔刷
    painter.setPen(Qt::NoPen);
    painter.drawRect(0, 0, w, w); // 绘制w x w的白色背景
    painter.setBrush(Qt::black); // 设置黑色笔刷用于绘制方块 for (qint32 y = 0; y < qrcodeW; y++)
    {
    for (qint32 x = 0; x < qrcodeW; x++)
    {
    unsigned char b = qrcode->data[(y * qrcodeW) + x];
    if (b & 0x01) // 1=黑、0=白
    {
    QRectF rect(x * size, y * size, size, size);
    painter.drawRect(rect); // 绘制黑色格子
    }
    }
    }
    delete qrcode;
    qrcode = nullptr; this->update(); // 绘制图片
    } /**
    * @brief 保存生成的二维码图片到指定路径
    * @param path 保存路径 + 名称.jpg
    * @return true 保存成功
    */
    bool QrCodeView::save(const QString& path)
    {
    if (path.isEmpty() || m_img.isNull())
    return false; QFileInfo info(path);
    if (info.suffix() == "jpg" || info.suffix() == "JPG") // 只支持保存为jpg格式
    {
    QDir().mkpath(info.path()); // 创建路径,防止路径不存在
    return m_img.save(path);
    }
    else
    {
    return false;
    }
    } /**
    * @brief 返回生成的二维码图片
    * @return
    */
    QImage QrCodeView::getImage()
    {
    return m_img;
    } /**
    * @brief 在控件中显示二维码
    * @param event
    */
    void QrCodeView::paintEvent(QPaintEvent* event)
    {
    QWidget::paintEvent(event); QPainter painter(this);
    int x = (this->width() - m_img.width()) / 2;
    int y = (this->height() - m_img.height()) / 2;
    painter.drawImage(x, y, m_img);
    }

7、完整源代码

            ️

         

️     

       

  ️    ⁣

           |/

              ️

  ️         ️

_

Qt-qrencode开发-生成、显示二维码📀的更多相关文章

  1. 我写的一个Qt 显示二维码( QR Code)的控件(可以去掉对 libpthread 的依赖,而且编译出的库文件可以在 vc2010 的release 模式下使用)

    最近一个项目需要显示二维码,所以花了点时间(只用了一个晚上,写的很不完善),写了个显示二维码的控件.当然这个控件用到了些开源的代码,比如qrencode,所以我也打算把我的代码开源. 我的代码参考了 ...

  2. mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案

    微信小程序概念的提出,绝对可以算得上中国IT界惊天动地的一件大事,这可能意味着一场新的开发热潮即将到来, 我也怀着激动的心情准备全身心投入其中,不过截止目前,在官方网站上下载的最新版本都无法使用,打开 ...

  3. 解决Mac版微信小程序开发工具打开后无法显示二维码

    问题描述: 正常情况下,打开微信小程序开发工具后,首页提示扫描二维码进行登陆,但是如果不显示二维码,当然无法登陆. 解决方案: 无法显示二维码肯定是程序运行哪里出错了,我们直接点击桌面图标是无法排查错 ...

  4. 【转】mac版微信web开发者工具(小程序开发工具)无法显示二维码 解决方案

    转自:https://www.cnblogs.com/stevenluo/p/6030445.html   微信小程序概念的提出,绝对可以算得上中国IT界惊天动地的一件大事,这可能意味着一场新的开发热 ...

  5. 公司开发的APP,如何生成一个二维码,供客户下载使用

    1.其实和简单,因为一般的用户使用扫一扫,大多数都是用微信自带的扫一扫工具 而,微信打开的二维码页面,会自动屏蔽apk文件,所以显然把apk的url生成一个二维码,让用户扫一扫就能直接下载,这样是行不 ...

  6. iOS开发-定制多样式二维码

    iOS开发-定制多样式二维码   二维码/条形码是按照某种特定的几何图形按一定规律在平台(一维/二维方向上)分布的黑白相间的图形纪录符号信息.使用若干个与二进制对应的几何形体来表示文字数值信息. 最常 ...

  7. Android开发之扫描二维码开发

    原贴地址:http://www.cnblogs.com/Fndroid/p/5540688.html 二维码其实有很多种,但是我们常见的微信使用的是一种叫做QRCode的二维码,像下面这样的,可以放心 ...

  8. pbfunc外部函数扩展应用-直接在Datawindow中生成QR二维码,非图片方式

    利用pbfunc外部函数在Datawindow中直接生成QR二维码,非图片方式.需要注意以下面几点: Datawindow的DataObject的单位必须为像素(Pixels). Datawindow ...

  9. Google API快速生成QR二维码

    Google API快速生成QR二维码 现在来说生成二维码最简单的方法是使用Google Chart API来实现,再次膜拜Google大神- Google Chart API是一套可以让你在线生成报 ...

  10. 分享:Java 开发精美艺术二维码

    博客地址:https://ainyi.com/58 Java 开发精美艺术二维码 看到网络上各种各样的二维码层出不穷,好像很炫酷的样子,一时兴起,我也要制作这种炫酷二维码效果 例如: 根据以往例子 根 ...

随机推荐

  1. JavaScript 高阶技巧

    0x01 深浅拷贝 开发中经常需要拷贝(复制)一个对象,如果直接赋值,则对拷贝对象的修改会影响到源对象 const o1 = { a: 1, b: 2 } const o2 = o1 console. ...

  2. mysql 简单进阶 ———— 重构查询[二]

    前言 简单整理一下重构查询. 正文 为什么我们需要重构查询,原因也很简单,那就是查询慢. 为什么会查询慢? 查询性能慢底下的最基本的原因是访问的数据太多. 某些查询不可避免地需要筛选大量的数据,但这并 ...

  3. spring cloud 学习笔记 客户端(本地)均衡负载(三)

    前言 在微服务中,一个服务可能即是服务端也是客户端,当别的服务调用该服务的时候这个服务就是服务端,当这个服务主动调用另外一个服务的时候,那么就是服务端. 作为客户端通过服务注册与发现获取某个服务的注册 ...

  4. FPGA芯片结构介绍及工作原理解析

    FPGA工作原理与简介    如前所述,FPGA是在PAL.GAL.EPLD.CPLD等可编程器件的基础上进一步发展的产物.它是作为ASIC领域中的一种半定制电路而出现的,即解决了定制电路的不足,又克 ...

  5. 2024-04-17:用go语言,欢迎各位勇者莅临力扣城,本次的挑战游戏名为「力扣泡泡龙」。 游戏的起点是一颗形状如二叉树的泡泡树,其中每个节点的值代表该泡泡的分值。勇者们有一次机会可以击破一个节点泡

    2024-04-17:用go语言,欢迎各位勇者莅临力扣城,本次的挑战游戏名为「力扣泡泡龙」. 游戏的起点是一颗形状如二叉树的泡泡树,其中每个节点的值代表该泡泡的分值.勇者们有一次机会可以击破一个节点泡 ...

  6. 鸿蒙HarmonyO实战-ArkUI动画(组件内转场动画)

    前言 转场动画是一种在电影.视频和演示文稿中使用的动画效果,用于平滑地切换不同的场景或幻灯片.转场动画可以增加视觉吸引力,改善观众的观看体验. 常见的转场动画包括淡入淡出.滑动.旋转.放大缩小等效果. ...

  7. 飞桨PaddlePaddle的安装

    飞桨PaddlePaddle的安装 MacOS 下的 PIP 安装 一.环境准备 1.1 如何查看您的环境 可以使用以下命令查看本机的操作系统和位数信息: uname -m && ca ...

  8. 一不小心,它成为了 GitHub Alibaba Group 下 Star 最多的开源项目

    简介: 随着微服务的流行,应用更加轻量和高效,但是带来的困境是线上问题排查越来越复杂困难.传统的 Java 排查问题,需要重启应用再进行调试,但是重启应用之后现场会丢失,问题难以复现. 来源 | 阿里 ...

  9. [FAQ] 英文字母输入时变成了胖体

    如下,在输入法上右键,切换为 "半角" 即可. Link:https://www.cnblogs.com/farwish/p/17513598.html

  10. [FAQ] 在 Mac 系统上 yarn add canvas 安装失败的原因

      当使用 yarn add 安装某个 node 库时,如果出现失败,多半是由于 nodejs 版本问题引起的. 现在我们可以使用 nvm 方便的管理不同的 nodejs 进行随时切换. $ nvm ...