Qt基于QRencode实现生成二维码

 更新时间:2025年02月19日 08:36:18   作者:流星雨爱编程  
QRencode是一个开源的库,专门用于生成二维码(QR Code),这篇文章主要为大家详细介绍了Qt如何使用QRencode实现生成二维码功能,需要的可以参考下

1.QRencode简介

QRencode是一个开源的库,专门用于生成二维码(QR Code)。它支持多种编程语言的接口,包括C、C++、Python等。QR码是一种矩阵式二维码,常用于存储网址、联系信息、文字信息等,广泛应用于各种场景,如产品追踪、广告宣传、文档管理等。

QRencode的设计简洁高效,提供了易于使用的API接口,使得开发者能够轻松地在应用程序中集成QR码生成和处理功能。

它的官网:libqrencode

特性与优势

  • 输出格式:库支持生成多种格式的输出,包括PNG图片、SVG矢量图、ASCII文本形式的二维码等,这取决于库的具体实现和使用的接口。
  • C++接口:对于C++,qrencode提供了丰富的类和方法来方便地生成二维码。用户可以创建一个QRcode对象,向其中添加数据,然后将其渲染成所需的格式。
  • 跨平台:qrencode库是跨平台的,可以在多种操作系统上编译和使用,包括Windows、Linux、macOS等。
  • 生成能力:qrencode库能够生成不同版本和纠错级别的QR码,支持从最小的版本1(21x21的模块)到最高的版本40(177x177的模块),并且可以根据需要调整纠错等级(L、M、Q、H)。
  • C接口:对于C语言使用者,qrencode也提供了函数接口,通过这些函数可以直接操作二维码数据结构,进行编码和输出。
  • 依赖:在某些情况下,如生成PNG图片输出时,qrencode可能需要额外的依赖,如libpng和zlib库。

2.编译qrencode

1.下载源代码

2.将qrencode-4.1.1解压后,创建一个build文件夹;

3.打开Cmake,将qrencode-4.1.1文件夹下的CMakeLists.txt文件拖入CMake中;

4.点击【Configure】;

5.这里我选择了MSVC2017-64编译器,点击【Finish】;

6.如下图所示进行配置,配置不正确会由于没有准备依赖而报错;

  • 设置编译后的安装路径为C:/Users/MHF/Downloads/qrencode-4.1.1/QRencode
  • 勾选WITHOUT_PNG,表示不支持png;
  • 取消勾选WITH_TOOLS,否则会报错。

7.然后点击【Generate】、【Open Project】打开VS;

8.鼠标右键选择【ALL_BUILD】,点击【生成】,然后选择【INSTALL】,点击【生成】;

9.就可以在安装路径下生成编译好的文件了;

在QT中引入编译为静态库的QRencode

  • 创建一个工程,将编译后的QRencode文件夹复制到工程中;
  • 在工程的pro文件中添加下列代码;
CONFIG(debug, debug|release): {
LIBS += -L$$PWD/QRencode/lib/ -lqrencoded
}else{
LIBS += -L$$PWD/QRencode/lib/ -lqrencode
}
INCLUDEPATH += $$PWD/QRencode/include
DEPENDPATH += $$PWD/QRencode/include

3.在Qt中直接使用QRencode源码

3.1.添加源码

将qrencode-4.1.1文件夹中除了.h、.c、config.h.in外的文件删除,文件夹也删除,qrenc.c也删除;

将config.h.in重命名为config.h;

在pro文件中添加所有.h 、.c文件;

注意:还需要添加DEFINES += HAVE_CONFIG_H

编译后会报错error: C2065: “MAJOR_VERSION”: 未声明的标识符

打开config.h文件,如下图所示;

MAJOR_VERSIONMICRO_VERSIONMINOR_VERSIONVERSION四项修改为如下所示,与自己下载的版本号相同;

然后就可以正常编译了;

3.2.用字符串生成二维码

使用 QRcode_encodeString 或其他相关函数来生成二维码数据。这个函数会返回一个 QRcode 结构体,其中包含了二维码的像素数据。将 QRcode 结构体中的数据转换为图像格式,以便在屏幕上显示或打印出来。通常,你会遍历二维码的每个像素,并根据像素值(0 或 1)来设置图像的对应像素为黑色或白色。

void QRCodeDemo::setCodeString(const QString& strCodeString)
{
    m_strCodeString = strCodeString;
}
 
void QRCodeDemo::paintEvent(QPaintEvent *event)
{
    QRcode *qrcode;
    qrcode = QRcode_encodeString(m_strCodeString.toStdString().c_str(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);
    if (nullptr == qrcode)
    {
        return QWidget::paintEvent(event);
    }
    qint32 temp_width = ui.label->width();
    qint32 temp_height = ui.label->height();
    qint32 qrcode_width = qrcode->width > 0 ? qrcode->width : 1;
    double scale_x = (double)temp_width / (double)qrcode_width;
    double scale_y = (double)temp_height / (double)qrcode_width;
    //QImage mainimg = QImage(temp_width, temp_height, QImage::Format_ARGB32);
    m_qrcodeImage = QImage(temp_width, temp_height, QImage::Format_ARGB32);
    QPainter painter(&m_qrcodeImage);
 
    QColor background(Qt::white);
    painter.setBrush(background);
    painter.setPen(Qt::NoPen);
    painter.drawRect(0, 0, temp_width, temp_height);
    QColor foreground(QColor("#002266")); // 二维码颜色
    painter.setBrush(foreground);
    qDebug()<<qrcode_width<<qrcode_width;
    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*scale_x, y*scale_y, scale_x, scale_y);
                painter.drawRects(&r, 1);
            }
        }
    }
 
    ui.label->setPixmap(QPixmap::fromImage(m_qrcodeImage));
    return QWidget::paintEvent(event);
}
 
void QRCodeDemo::on_pushButton_clicked()
{
    setCodeString(ui.lineEdit->text());
}

保存二维码图片:

void QRCodeDemo::on_pushButton_2_clicked()
{
    QString path("./12334434556.jpg");
    m_qrcodeImage.save(path);
}

3.3.用二进制数据生成二维码

调用 QRcode_encodeData 可以把图片或其它二进制类型的数据转换为二维码,使用起来比较简单,在这里就不多距离了。

3.4.界面设计

通过Qt Designer设计程序界面,包括:

一个输入框,用于接收用户输入的内容。

一个按钮,用户点击后触发二维码生成。

一个显示区域,用于实时展示生成的二维码。

一个按钮,用户点击后保存二维码,这个按钮是动态生成的。

3.5.效果展示

点击保存按钮,会在当前运行目录下生成相应的二维码图片:

4.注意事项

二维码无法识别:可能是由于二维码生成时参数设置不当(如版本过低、容错率过低等)或二维码图像质量不佳(如模糊、破损等)导致的。解决方案是调整参数或提高图像质量。

库依赖问题:在编译或运行QRencode时可能会遇到库依赖问题。解决方案是确保系统中已安装所有必要的库文件,并使用包管理器进行管理和更新。

错误处理:在实际应用中,你应该添加更多的错误处理代码,比如检查QRcode_encodeString的返回值是否为NULL,以及处理任何可能的异常或错误情况。

以上就是Qt基于QRencode实现生成二维码的详细内容,更多关于Qt QRencode二维码的资料请关注脚本之家其它相关文章!

相关文章

  • 深入了解C++11中promise和future的使用

    深入了解C++11中promise和future的使用

    C++11中promise和future机制是用于并发编程的一种解决方案,用于在不同线程完成数据传递(异步操作)。Promise和Future提供了访问异步操作结果的机制,可以在线程之间传递数据和异常消息。本文就来聊聊二者的使用,希望对大家有所帮助
    2022-11-11
  • C语言超详细解析函数栈帧

    C语言超详细解析函数栈帧

    在C语言中,每一个正在运行的函数都有一个栈帧与其对应,栈帧中存储的是该函数的返回地址和局部变量。从逻辑上讲,栈帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里等等
    2022-03-03
  • C/C++中虚基类详解及其作用介绍

    C/C++中虚基类详解及其作用介绍

    这篇文章主要介绍了C/C++中虚基类的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++实现迷宫算法实例解析

    C++实现迷宫算法实例解析

    这篇文章主要介绍了C++实现迷宫算法实例解析,是一个比较经典的C++算法,有一定的学习与借鉴价值,需要的朋友可以参考下
    2014-07-07
  • C语言完整特性详情

    C语言完整特性详情

    这篇文章主要介绍了C# 10的相关资料方法,感兴趣的朋友可以参考下文
    2021-08-08
  • C++实现加减乘除计算器

    C++实现加减乘除计算器

    这篇文章主要为大家详细介绍了C++实现加减乘除计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>
    2022-01-01
  • VisualStudio2022下配置 OpenMP多线程编程环境与运行

    VisualStudio2022下配置 OpenMP多线程编程环境与运行

    本文主要介绍了VisualStudio2022下配置 OpenMP多线程编程环境与运行,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • C语言详细讲解位运算符的使用

    C语言详细讲解位运算符的使用

    C语⾔既具有⾼级语⾔的特点,⼜具有低级语⾔的特性,如⽀持位运算就是其具体体现。这是因为,C语⾔最初是为取代汇编语⾔设计系统软件⽽设计的,因此C语⾔必须⽀持位运算等汇编操作。位运算就是对字节或字内的⼆进制数位进⾏测试、抽取、设置或移位等操作
    2022-04-04
  • C语言正则表达式操作示例

    C语言正则表达式操作示例

    这篇文章主要介绍了C语言正则表达式操作,结合实例形式分析了C语言正则匹配类似邮箱格式功能的实现技巧,需要的朋友可以参考下
    2017-07-07
  • C++ LeetCode1769移动所有球到每个盒子最小操作数示例

    C++ LeetCode1769移动所有球到每个盒子最小操作数示例

    这篇文章主要为大家介绍了C++ LeetCode1769移动所有球到每个盒子所需最小操作数示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论