目录导读
- 前言
- 使用Code128生成简单条形码
- 使用QRencode库生成二维码
- 添加QRencode.Pri 模块化
前言
对在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.hSOURCES += \$$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));
}
- 界面示例: