使用QRencode生成二维码
文章目录
- 一、QRencode介绍
- 二、使用步骤
- 1、下载源码
- 2、编译源码
- 3、生成二维码
一、QRencode介绍
QRencode 是一个用于生成QR码(二维码)的库,它支持多种编程语言的接口,包括C、C++、Python等。它能够生成不同版本和纠错级别的QR码,支持从最小的版本1(21x21的模块)到最高的版本40(177x177的模块),并且可以根据需要调整纠错等级(L、M、Q、H)。
支持生成多种格式的输出,包括PNG图片、SVG矢量图、ASCII文本形式的二维码等,这取决于库的具体实现和使用的接口。支持多种数据类型编码,如数字、字母、二进制数据、UTF-8文本、电子邮件地址、电话号码、URL等。
对于C++,QRencode提供了丰富的类和方法来方便地生成二维码。用户可以创建一个QRcode对象,向其中添加数据,然后将其渲染成所需的格式。
QRencode库是跨平台的,可以在多种操作系统上编译和使用,包括Windows、Linux、macOS等。在某些情况下,如生成PNG图片输出时,qrencode可能需要额外的依赖,如libpng和zlib库。
二、使用步骤
1、下载源码
下载地址:https://fukuchi.org/works/qrencode/,之后解压。在解压后的文件夹内新建 build 和 output 目录。
2、编译源码
打开 CMake,在 “Where is the source code” 中选择QRencode源码目录,在 “Where to build the binaries” 中选择构建目录(即 build 文件夹)。
点击 “Configure” 按钮,选择 “Visual Studio 16 2019” 作为生成器,选择平台为 “x64”(特别注意:这里选择的 Visual Studio 版本需要和使用这个库的工程同个版本)。
点击"Finish"。在 Configure 完成后,会看到一些红色的配置选项,主要确认以下选项:
- BUILD_SHARED_LIBS,是否生成动态库
- CMAKE_INSTALL_PREFIX,选择 output 文件夹
- WITHOUT_PNG,勾选此项,表示不支持png
- WITH_TOOLS,取消勾选此项,否则会报错
然后点击”Generate“、”Open Project“ 打开Visual Studio。鼠标右键选择”ALL_BUILD“,点击”生成“,然后选择”INSTALL“,点击”生成“:
在 output 下看到生成的库文件:
3、生成二维码
现在可以利用QRencode库来生成二维码了:
#include "qrencode.h"
#pragma comment(lib, "qrencoded.lib")
void generateQRCode() {
QString text = "123456789";
// 使用QRencode生成二维码数据
QRcode *qrCode = QRcode_encodeString(text.toUtf8().constData(),
0, // 版本
QR_ECLEVEL_L, // 纠错级别
QR_MODE_8, // 编码模式
1); // 是否使用大小写区分
if (!qrCode) return;
// 设置二维码图片大小
int width = qrCode->width;
int scale = 4; // 放大倍数
int margin = 10; // 边距
int imageSize = width * scale + 2 * margin;
// 创建QImage
QImage image(imageSize, imageSize, QImage::Format_RGB32);
image.fill(Qt::white);
// 绘制二维码
QPainter painter(&image);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::black);
for(int y = 0; y < width; y++) {
for(int x = 0; x < width; x++) {
if(qrCode->data[y * width + x] & 1) {
painter.drawRect(margin + x * scale,
margin + y * scale,
scale,
scale);
}
}
}
// 在QLabel控件上显示二维码
QLabel *imageLabel = new QLabel(this);
imageLabel->setPixmap(QPixmap::fromImage(image));
// 释放QRcode对象
QRcode_free(qrCode);
}