C/C++二维码生成库qrencode编译与使用

1 qrencode介绍

  • qrencode 是一个用于生成 QR 码(Quick Response Code)的工具和库。QR 码是一种矩阵条形码或二维条形码,能够在水平和垂直方向上存储信息。qrencode 支持多种编码方式,并能够生成不同复杂度和错误校正级别的 QR 码。

2 资源

3 编译

  • 如果不想自己编译,可以跳过此章节。我分别编译了Windows和Linux平台的静态和动态库,可直接使用
  • 工程地址
  • 这里以 4.1.0版本为例

3.1 Windows平台编译

  • 找到cmake的安装目录的 bin目录下,双击打开cmake ui界面cmake-gui.exe
  • 分别选择qrencode代码根目录和编译目录,可创建一个build目录,在build目录中编译
    • 在这里插入图片描述
  • 点击Configure后,会弹出一个对话框,分别选择编译器和架构。然后点击Finish,等待配置生成。
    • 在这里插入图片描述
  • 等待配置生成后,会出现一些选项。默认是生成静态库,勾选BUILD_SHARED_LIBS会生成动态库,CMAKE_INSTALL_PREFIX选择安装目录,默认会安装到C:/Program Files (x86)/QRencode目录下
    • 在这里插入图片描述
  • 选项设置完成后,点击Genrate
  • 如果出现以下报错,不用管,进入qrencode源代码根目录下的build目录,双击打开QRencode.sln,用visual studio编译。
    • 在这里插入图片描述
  • 先选择qrencode工程,点击生成,会生成头文件和库,再点击INSTALL,点击生成,会进行安装。这样在build目录下会生成includelib目录,其中就是生成的头文件和库文件。
    • 在这里插入图片描述

3.2 Linux平台编译

  • 进入源代码根目录,在根目录下创建build文件夹,在build目录下执行cmake ..
  • 接下来需要打开Linux平台的cmake gui工具,在build目录下执行ccmake .,如果没有此命令,执行apt install cmake-curses-gui安装Linux平台的cmake gui工具。
  • 执行ccmake .后会打开一个页面
    • 在这里插入图片描述
  • 和Windows一样,BUILD_SHARED_LIBS 代表是否生成动态库。点击上下按钮可以移动光标,点击回车可以修改值。CMAKE_INSTALL_PREFIX表示安装目录,光标选到这一项后,先点击回车,输入目录地址,再点击回车。全部修改完成后,点击c进行保存,点击q退出。
    • 在这里插入图片描述
  • 然后执行make进行编译,如果出现以下报错,可能是系统缺少libpng库
    • 在这里插入图片描述
  • libpng库 在这里选择一个编译安装。
  • 编译完成后,再执行make install进行安装。同样在build目录下会生成include和lib目录,里面是对应的头文件和库文件。

4 qrencode使用

4.1 API介绍

  • qrencode核心API就一个
    •   /*
        * 函数功能: 用于将给定的字符串编码为二维码
        * 参数string: 要编码成二维码的数据字符串。
        * 参数version: 二维码的版本,范围从1到40。
        *                              1是最小的版本,可以容纳26个字节的数据
        *                              40是最大的版本,可以容纳最多2953个字节的数据
        *                              如果设为0,则自动选择合适的版本。
        * 参数level: 错误修正级别。有以下四个取值,即二维码可以接收的数据损坏程度。
        *                             QR_ECLEVEL_L = 0,  -  7%
        *								QR_ECLEVEL_M,      -  15%
        *								QR_ECLEVEL_Q,      -  25%
        *								QR_ECLEVEL_H       -  30%
        * 参数hint: 数据编码模式
        * 参数casesensitive: 如果为非零值,则在编码时区分大小写,否则不区分大小写。
        * 返回值:指向 QRcode 结构体指针的指针。
        *               成功编码后,这个指针会被设置为指向新创建的 QRcode 结构体,该结构体包含了生成的 QR 码信息。
        */
        QRcode *QRcode_encodeString(const char *string, int version, QRecLevel level, 
        							QRencodeMode hint, int casesensitive);
      

4.2 在QT中使用

  • 接下来就演示下如何在Qt中使用qrencode。
  • 首先创建一个QT工程,然后将qrencode的头文件和库文件拷贝到QT工程目录下,这里是Windows平台动态库为例。
  • 打开pro文件,右击选择添加库,选择外部库。
    • 在这里插入图片描述
  • 只勾选Windows,选择动态库,选择对应的库文件。然后下一步点击完成即可。
    • 在这里插入图片描述
  • 在QT窗口中需要添加一个QLabel控件,用于显示二维码信息。
  • 代码如下
    •   #include "widget.h"
        #include "ui_widget.h"
        #include "qrencode.h"
        #include <QPainter>
        
        Widget::Widget(QWidget *parent) :
            QWidget(parent),
            ui(new Ui::Widget)
        {
            ui->setupUi(this);
        
            createQR("Hello qrencode");
        }
        
        Widget::~Widget()
        {
            delete ui;
        }
        
        void Widget::createQR(char *data)
        {
            // 生成二维码
            QRcode *qrcode = QRcode_encodeString(data, 0, QR_ECLEVEL_L, QR_MODE_8, 0);
            if(qrcode == NULL){
                return;
            }
        
            QImage image(qrcode->width, qrcode->width, QImage::Format_ARGB32);
            QPainter painter(&image);
            painter.setBrush(Qt::white);
            painter.setPen(Qt::NoPen);
            painter.setRenderHint(QPainter::Antialiasing, false);
            painter.drawRect(0, 0, qrcode->width, qrcode->width);
            painter.setBrush(Qt::black);
        
            // 绘制二维码
            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, y, 1, 1);
                        painter.drawRect(r);
                    }
                }
            }
        
            QRcode_free(qrcode);
        
            // 图片显示到控件
            ui->label->setPixmap(QPixmap::fromImage(image));
            ui->label->setScaledContents(true);
        }
      
  • 效果演示。编译运行后就会生成一个二维码。
    • 在这里插入图片描述
  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大草原的小灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值