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

news/2024/11/15 6:45:15/

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目录下会生成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);}
      
  • 效果演示。编译运行后就会生成一个二维码。
    • 在这里插入图片描述

http://www.ppmy.cn/news/1518844.html

相关文章

R语言统计分析——单因素协方差分析

参考资料&#xff1a;R语言实战【第2版】 单因素协方差分析&#xff08;ANCONA&#xff09;扩展了单因素方差分析&#xff08;ANOVA&#xff09;&#xff0c;包含一个或多个定量的协变量。下面使用multcomp包中的litter数据集进行操作&#xff1a; # 加载数据集 data(litter,p…

web笔记:JSP基础

一、什么是JSP&#xff1f; 建立在Servlet规范之上的动态网页开发技术。在JSP文件中&#xff0c;HTML代码与Java代码共同存在。 HTML代码用来实现网页中静态内容的显示。Java代码用来实现网页中动态内容的显示。 二、JSP的运行原理 由JSP引擎(JSP容器)将jsp转换为Servlet 当客…

【生成模型系列(初级)】自编码器——深度学习的数据压缩与重构

【通俗理解】自编码器——深度学习的数据压缩与重构 第一节&#xff1a;自编码器的类比与核心概念 1.1 自编码器的类比 你可以把自编码器想象成一个“智能压缩机”&#xff0c;它能够把输入的数据&#xff08;比如图片&#xff09;压缩成一个更小的表示&#xff08;编码&#…

React 入门第七天:探索状态管理与Context API

在React学习的第七天&#xff0c;我深入了解了React的状态管理机制&#xff0c;特别是如何通过Context API来实现跨组件的状态共享。React的状态管理是组件交互的核心&#xff0c;而Context API则为全局状态的共享提供了一个简洁而强大的解决方案。 1. React 中的状态管理 Re…

在Ubuntu 16.04上安装MongoDB的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 MongoDB 是一款常用于现代 Web 应用程序的免费开源 NoSQL 文档数据库。本教程将帮助您在服务器上为生产应用程序环境设置 MongoDB…

Python画笔案例-023 绘制一朵小花

1、绘制一朵小花 通过 python 的turtle 库绘制一朵小花的图案&#xff0c;如下图&#xff1a; 2、实现代码 绘制一朵小花&#xff0c;以下为实现代码&#xff1a; """一朵小花.py """ import turtle as t # 导入海龟模块做为tt.bgcolor…

Electron快速上手

什么是Electron 一款应用广泛的跨平台的桌面应用开发框架。Electron的本质是结合了 Chromium 与Node.js。使用HTML、CSS、JS 等Web技术构建桌面应用程序。 .vue,.tsx,.less,.ts也可以使用 Electron 流程模型 主进程是纯node环境&#xff0c;可以访问__dirname,fs模块等&#…

《C++打造高效网络爬虫:突破数据壁垒》

在当今信息爆炸的时代&#xff0c;网络爬虫成为了获取大量数据的重要工具。而 C作为一种高效、强大的编程语言&#xff0c;在实现高效网络爬虫方面具有独特的优势。 首先&#xff0c;C的高效性能是实现高效网络爬虫的关键。与其他编程语言相比&#xff0c;C在运行速度和内存管…