前言

对在QT开发中使用QRencode库生成二维码
和使用Code128生成简单条形码
进行一个学习使用总结。


使用Code128生成简单条形码

‌Code128条形码是一种高密度条码,广泛应用于企业内部管理、生产流程和物流控制系统中。‌ 它能够表示从ASCII 0到ASCII 127共128个字符,包括数字、字母和符号‌1。
‌Code128条形码由六部分组成:空白区域、起始标记、数据区、校验符、终止符和另一个空白区域‌2。每个字符由一个条开始,以一个空结束,通常最后一个条形与终止符组合成一个更宽的终止符‌

示例中的Code128条形码生成,是直接使用的GitHub上的promixis/Code128项目源码文件,
直接添加Code128.h Code128.cpp文件到项目中,
如果是 MSCV编译器,还需要修改类中Symbol类型为:
typedef QString Symbol;
在这里插入图片描述
然后直接调用就行。

  • 示例代码:

固定长宽为[200,80],直接在QImage类中绘制。

#include "code128.h"
#include <QImage>
#include <QPainter>

 void MainWindow::on_pushButton_clicked()
{
    QString str=ui->lineEdit->text();
    if (str.isEmpty())
        return;

   float m_Width=200;
   float m_Height=80;
   float m_CodeLength;

   Code128::BarCode m_Code = Code128::encode(str);
   m_CodeLength = 0;
   for (int i=0;i<m_Code.length();i++)
   {
       m_CodeLength+=m_Code[i];
   }

   //! 平均间隔
   float lineWidth = m_Width / m_CodeLength;

   QImage  m_img = QImage(m_Width, m_Height, QImage::Format_ARGB32);
   QPainter painter(&m_img);
   painter.setBrush(Qt::white);   // 设置白色笔刷
   painter.setPen(Qt::NoPen);
   painter.drawRect(QRectF(0, 0, m_Width, m_Height));   // 绘制w x w的白色背景
   painter.setBrush(Qt::black);    // 设置黑色笔刷用于绘制方块

   float left = 0;
   for (int i=0;i<m_Code.length();i++)
   {

       float width = m_Code[i] * lineWidth;
       if ( i % 2 == 0 )
       {
           QRectF bar(left, 0, width, m_Height );
           painter.fillRect(bar, Qt::SolidPattern);
       }
       left+= width;
   }

   ui->label->setPixmap(QPixmap::fromImage(m_img));
}

  • 界面示例:

在这里插入图片描述
通过手机微信的条形码识别中心识别到123456abcd

  • Code128不支持中文内容 :

‌Code128不支持中文。‌ Code128是由Computer Identics Corporation在1981年研制的,它支持全部128个ASCII码字符,包括数字、大写和小写字母以及一些特殊字符,但并不包括中文字符‌12。
‌Code128的字符集包括数字、大写和小写字母以及一些特殊字符,具体来说,Code128有A、B、C三种字符集,每种字符集支持不同的字符范围。A字符集支持大写字母、数字和一些特殊字符;B字符集支持大小写字母、数字和一些特殊字符;C字符集仅支持数字,且必须是偶数位,不足时前面补零‌

Code128不支持中文内容,实际上包含中文后再通过手机微信的条形码识别中心识别,也只获取到中文后面的内容:
在这里插入图片描述
只获取到: 9527123456

Code128只能生成简单的条形码,如果需要生成其他类型的条形码建议参考:
Qt 中利用 GNU barcode 生成一维条形码
Qt 二维码生成与识别库:QZXing 的编译与使用


使用QRencode库生成二维码

qrencode-4.1.1
源码下载地址:https://fukuchi.org/works/qrencode/

‌qrencode库是一个用于生成QR码的开源库,支持多种编程语言的接口,包括C、C++、Python等。‌ QR码是一种矩阵式二维码,广泛应用于存储网址、联系信息、文字信息等场景,具有容量大、可靠性高、保密防伪性强等特点‌
‌QR码的容量可达7000位或4000个字符,具有很高的鲁棒性‌23。
‌多平台支持‌:qrencode库适用于多个平台,包括Windows、Linux等,并且可以在命令行实用程序中输出各种格式的QR码图像‌
出自:文言一心

本文对于QRencode库的使用完全参照:
Qt-qrencode开发-生成二维码📀中的示例内容,
唯一不同的是我选择通过.Pri 模块化设计的方式将源码包含到项目中。

添加QRencode.Pri 模块化

以QRencode.Pri的方式添加与 Qt-qrencode开发-生成二维码::在Qt中直接使用QRencode源码差不多,只是将pro文件改为了Pri文件:

  • 删除多余文件:

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

在这里插入图片描述

  • 修改config.h文件:

同样将以下宏定义

/* Major version number */
#undef MAJOR_VERSION
/* Micro version number */
#undef MICRO_VERSION
/* Minor version number */
#undef MINOR_VERSION
/* Version number of package */
#undef VERSION

修改为:

/* Major version number */
#define MAJOR_VERSION 4
/* Micro version number */
#define  MICRO_VERSION 1
/* Minor version number */
#define  MINOR_VERSION 1
/* Version number of package */
#define VERSION "4.1.1"
  • 添加到.Pri目录中:

在qrencode-4.1.1文件夹 同级目录中
创建一个txt文本文件,修改文件后缀和名称为QRencode.pri
写入所有文件目录路径

DEFINES += HAVE_CONFIG_H
HEADERS += \
    $$PWD/bitstream.h \
    $$PWD/config.h \
    $$PWD/mask.h \
    $$PWD/mmask.h \
    $$PWD/mqrspec.h \
    $$PWD/qrencode.h \
    $$PWD/qrencode_inner.h \
    $$PWD/qrinput.h \
    $$PWD/qrspec.h \
    $$PWD/rsecc.h \
    $$PWD/split.h

SOURCES += \
    $$PWD/bitstream.c \
    $$PWD/mask.c \
    $$PWD/mmask.c \
    $$PWD/mqrspec.c \
    $$PWD/qrencode.c \
    $$PWD/qrinput.c \
    $$PWD/qrspec.c \
    $$PWD/rsecc.c \
    $$PWD/split.c

修改qrencode-4.1.1文件夹 名称为QRencode;
复制整个文件夹到Pro项目目录下
在Pro文件中添加
#附加QRencode源码
include(QRencode/QRencode.pri)

如下图示:

在这里插入图片描述

  • 代码调用示例:

同样是绘制到QImage上,然后赋值给控件显示

#include <QDebug>
#include <QImage>
#include <QPainter>
#include <QPixmap>
#include "QRencode/qrencode.h"

void MainWindow::on_pushButton_clicked()
{
    QString str=ui->lineEdit->text();
    if (str.isEmpty())
        return;
    QRcode* qrcode = QRcode_encodeString(str.toStdString().data(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);
    if (!qrcode)   // 错误返回null
    {
        qInfo() << errno;   // 打印错误码
        return;
    }

    int w = qMin(ui->label->width(), ui->label->height());   // 控件长宽的最小值,保证绘制完整正方形
    int qrcodeW = qMax(qrcode->width, 1);
    qreal size = w / qreal(qrcodeW);   // 二维码小格子的长宽

    QImage  m_img = QImage(w, w, QImage::Format_ARGB32);
    QPainter painter(&m_img);
    painter.setBrush(Qt::white);   // 设置白色笔刷
    painter.setPen(Qt::NoPen);
    painter.drawRect(0, 0, w, w);   // 绘制w x w的白色背景
    painter.setBrush(Qt::black);    // 设置黑色笔刷用于绘制方块

    for (qint32 y = 0; y < qrcodeW; y++)
    {
        for (qint32 x = 0; x < qrcodeW; x++)
        {
            unsigned char b = qrcode->data[(y * qrcodeW) + x];
            if (b & 0x01)   // 1=黑、0=白
            {
                QRectF rect(x * size, y * size, size, size);
                painter.drawRect(rect);   // 绘制黑色格子
            }
        }
    }
    delete qrcode;
    qrcode = nullptr;

    ui->label->setPixmap(QPixmap::fromImage(m_img));
}

  • 界面示例:

在这里插入图片描述

源码下载

示例源码见附件资源

更多推荐