1 qrencode介绍
- qrencode 是一个用于生成 QR 码(Quick Response Code)的工具和库。QR 码是一种矩阵条形码或二维条形码,能够在水平和垂直方向上存储信息。qrencode 支持多种编码方式,并能够生成不同复杂度和错误校正级别的 QR 码。
2 资源
- gitub
- 官网
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
目录下会生成include
和lib
目录,其中就是生成的头文件和库文件。
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);}
-
- 效果演示。编译运行后就会生成一个二维码。