目录导读
- 前言
- 使用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.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));
}
- 界面示例: