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

news2024/11/13 12:04:00

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.coloradmin.cn/o/2091934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机组成原理:实验四常规型微程序控制器组成实验

一、实验目的 1.掌握时序产生器的组成原理。 2.掌握微程序控制器的组成原理。 3.掌握微指令格式的化简和归并。 二、实验电路 1.时序发生器 TEC-4计算机组成原理实验系统的时序电路如图4.1所示。电路采用2片GAL22V10&#xff08;U6、U7&#xff09;&#xff0c;可产生两极…

微信小程序App实现小车方向控制

目录 概述 1 系统框架结构 1.1 结构介绍 1.2 硬件模块介绍 1.2.1 蓝牙模块介绍 1.2 .2 模块功能介绍 2 功能实现 2.1 微信小程序APP 2.2 下位机功能 3 功能测试 3.1 小程序UI测试 3.2 小车方向控制 微信小程序和蓝牙模块控制小车运行状态 概述 本文主要介绍使用微信…

vue.js项目实战案例源码

Vue.js是一个用于构建用户界面的渐进式框架&#xff0c;非常适合开发单页面应用。以下是一些实战案例的源码&#xff0c;可以帮助你更好地理解和使用Vue.js&#xff1a; Vue TodoMVC 简介&#xff1a;这是学习Vue.js的入门级项目&#xff0c;主要实现了一个待办事项列表。源码地…

Python优化算法17——黄金正弦算法(GSA)

科研里面优化算法都用的多&#xff0c;尤其是各种动物园里面的智能仿生优化算法&#xff0c;但是目前都是MATLAB的代码多&#xff0c;python几乎没有什么包&#xff0c;这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考&#xff1a;Python优化算…

从 CRX 文件安装 Chrome 扩展程序

在使用嵌入式 Browser 中的扩展程序时&#xff0c;您可能希望将它们打包并分发在应用程序中&#xff0c;并静默安装。 在本教程中&#xff0c;我将演示如何通过编程方式从 CRX 文件中安装扩展程序&#xff0c;保持它们的更新&#xff0c;并使用它们。 此外&#xff0c;我还会…

8.30工作笔记

要做的事情&#xff1a; 1 测试剩下的三个因子&#xff1a;coppock 潮汐因子 云开雾散 2 整理需要时间序列的因子 以及截面因子 3 灾后重建多了一列&#xff0c;灾后重建’所有值都是nan&#xff0c;这里不仅是灾后重建&#xff0c;所有的都要改 4 coppock 潮汐因子 云开雾散在…

排列数+时间戳+逆元取模

前言&#xff1a;这个题目是真的难&#xff0c;不会做&#xff0c;看了题解才发现是咋回事 题目地址 最主要的就是为啥是除以3&#xff0c;c之前需要完成a 和 b&#xff0c;d 和 e 对我们的答案没有影响&#xff0c;所以我们要除以 A(3,3) ,但是 a 和 b 的排列没有要求&#xf…

Sinc Function介绍

1、定义 Sinc函数全称&#xff1a;sine cardinal&#xff0c;也称作是sampling function&#xff08;采样函数&#xff09;。 2、分类 &#xff08;1&#xff09;归一化sinc函数&#xff1a; 这种定义在信号处理中被广泛采用&#xff0c;其中 x 是一个无量纲的变量&#xff0c;…

基于YOLO的车牌检测识别(YOLO+Transformer)

概述&#xff1a; 基于深度学习的车牌识别&#xff0c;其中&#xff0c;车辆检测网络直接使用YOLO侦测。而后&#xff0c;才是使用网络侦测车牌与识别车牌号。 车牌的侦测网络&#xff0c;采用的是resnet18&#xff0c;网络输出检测边框的仿射变换矩阵&#xff0c;可检测任意形…

同城小程序怎么做 同城小程序系统开发制作方案

很多同城创业的老板们想要做一个同城小程序但是不知道怎么做&#xff0c;本次瀚林就为大家详细介绍一下做同城小程序系统开发制作方法&#xff0c;给大家做个参考。 目前同城类型的小程序系统市面上比较常见的有&#xff1a;同城配送、鲜花订花、同城上门服务、同城跑腿、同城便…

中仕公考怎么样?事业编考试怎么备考?

事业编考试备考可以大致分为三个阶段&#xff0c;按照不同阶段根据自身的学习情况制定不同的学习计划即可。 ①基础阶段 有备考经验的考生可以忽略这一步&#xff0c;刚开始先打好基础很重要&#xff0c;根据课程和教材理解知识点&#xff0c;按照模块学习&#xff0c;对考试…

cnocr 安装

打开终端 如果不会打开终端 -> 终端打开输入 pip install cnocr 执行中途可能报错 去这里下载工具&#xff1a;c构建工具下载完打开&#xff0c;勾选这个 然后点安装安装完回到第2步重新执行

docker镜像所使用到的COW写时复制技术是什么

copy on write 简单来说&#xff0c;所有的读操作都是指向一份内存地址&#xff0c;共享这些数据&#xff0c;节省内存空间。 如果有进程要对数据进行写操作&#xff0c;系统会检测到这个行为&#xff0c;将数据复制一份出来&#xff0c;给这个进程进行写操作。其他进程继续…

5.3二叉树——二叉树链式结构实现

本篇博客梳理二叉树链式结构 明确&#xff1a;二叉树是递归定义的 递归的本质&#xff1a;当前问题子问题&#xff0c;返回条件是最小规模的子问题 一、二叉树的遍历 1&#xff0e;前序、中序与后序遍历 &#xff08;1&#xff09;前序&#xff1a;根->左子树->右子树…

全球知名度最高的华人颜廷利:世界公认十大思想家哲学家

全球知名度最高的华人颜廷利&#xff1a;世界公认十大思想家哲学家 在汉语这一中国优秀传统文化的瑰宝中&#xff0c;“色”与“舍”这两个字的发音分别被解读为“思恶”和“识恶”&#xff0c;揭示了一种深奥的文化现象。这种现象的根源&#xff0c;实则来自于我们的感官——眼…

linux上查找某应用所在的绝对路径

linux上查找某应用所在的绝对路径 1、已知应用名称 找到应用的进程号 例&#xff1a;查找nginx的进程号 ps -ef | grep nginx 或者 ps -aux | grep nginx 2、通过端口号找进程号 lsof -i:80 3、通过进程号找到所在目录&#xff0c;Linux在启动一个进程时,系统会在/proc目…

力扣刷题(3)

整数反转 整数反转-力扣 思路&#xff1a; 利用%和/不断循环取待反转整数的最后一位&#xff0c;注意判断是否超出范围。 int reverse(int x){int y0;while(x){if(y > INT_MAX/10 || y < INT_MIN/10)return 0;int tmpx%10;yy*10tmp;x/10;}return y; }字符串转换整数 …

多线程篇(基本认识 - 锁优化)(持续更新迭代)

目录 一、前言 二、阿里开发手册 三、synchronized 锁优化的背景 四、Synchronized的性能变化 1. Java5之前&#xff1a;用户态和内核态之间的切换 2. java6开始&#xff1a;优化Synchronized 五、锁升级 1. 无锁 2. 偏向锁 2.1. 前言 2.2. 什么是偏向锁 2.3. 偏向…

知识产权案件中的消费者问卷调查证据

在知识产权案件中&#xff0c;消费者问卷调查可以作为一种重要的证据形式。通过调查消费者的认知、态度、行为和观点&#xff0c;消费者问卷调查可以提供以下方面的证据支持&#xff1a; 1、商标或产品混淆&#xff1a;消费者问卷调查可以确定消费者对于涉及知识产权的商标或产…

《python语言程序设计》第8章第9题将二进制数作为字符串转换十六进制print和return的区别

在这里我发现了return和print的区别 def binary_to_hex(binary_value):len_text len(binary_value)for i in range(0, len_text, 4):#能把二进制分成四组进行打印print(binary_value[0 i:4 i])#只能运行将前4个数分成一组return binary_value[0 i:4 i]a binary_to_hex(&q…