QT集成QRencode与Code128:从源码集成到界面绘制的条码生成实战

张开发
2026/4/9 4:37:11 15 分钟阅读

分享文章

QT集成QRencode与Code128:从源码集成到界面绘制的条码生成实战
1. 为什么选择QT集成条码生成功能在开发GUI应用时条码功能的需求非常普遍。无论是商品管理系统、仓储物流软件还是会员卡应用都需要快速生成可识别的条形码或二维码。QT作为跨平台的C框架原生并未提供条码生成模块这就需要我们引入第三方库来实现。我经历过多个需要集成条码功能的QT项目发现QRencode和Code128这两个库的组合能覆盖90%的业务场景。QRencode生成的二维码可以存储网址、联系方式等复杂信息而Code128生成的条形码特别适合编码数字和字母组合比如产品序列号、订单编号等。这两个库的优势很明显首先它们都是开源项目不用担心授权问题其次代码量不大集成到QT项目中不会显著增加体积最重要的是生成速度快实测在普通PC上生成一个复杂二维码只需3-5毫秒完全能满足实时生成的需求。2. 准备开发环境与源码2.1 获取QRencode源码QRencode的最新稳定版是4.1.1可以直接从官网下载。我习惯把源码包解压到项目目录下的ThirdParty文件夹这样便于管理第三方依赖。解压后你会看到很多文件但实际上我们只需要保留这几个所有.h头文件所有.c源文件config.h.in配置文件特别提醒qrenc.c是命令行工具源码我们不需要它可以直接删除。config.h.in需要重命名为config.h并修改里面的版本定义#define MAJOR_VERSION 4 #define MICRO_VERSION 1 #define MINOR_VERSION 1 #define VERSION 4.1.12.2 处理Code128源码Code128的实现我推荐GitHub上的promixis/Code128项目。这个实现非常轻量只有两个文件Code128.hCode128.cpp需要注意的是如果使用MSVC编译器需要将源码中的Symbol类型定义改为typedef QString Symbol;3. 使用.pri文件模块化集成3.1 创建QRencode.pri文件QT的.pri文件非常适合用来管理模块化代码。我在QRencode源码同级目录创建QRencode.pri内容如下DEFINES HAVE_CONFIG_H HEADERS \ $$PWD/bitstream.h \ $$PWD/config.h \ $$PWD/qrencode.h \ # 其他头文件... SOURCES \ $$PWD/bitstream.c \ $$PWD/qrencode.c \ # 其他源文件...3.2 在项目中使用.pri文件在项目的.pro文件中添加include(ThirdParty/QRencode/QRencode.pri) include(ThirdParty/Code128/Code128.pri)这种方式的优势是保持源码目录结构清晰方便多项目共享同一套代码切换编译环境时不需要重新配置4. 实现Code128条形码生成4.1 基本生成逻辑Code128的编码过程很简单QString text ABC123; Code128::BarCode barcode Code128::encode(text);但要将条形码绘制到界面上需要一些计算float totalWidth 0; for(int i0; ibarcode.length(); i) { totalWidth barcode[i]; } float lineWidth targetWidth / totalWidth;4.2 使用QPainter绘制绘制条形码的核心代码如下QImage img(width, height, QImage::Format_ARGB32); QPainter painter(img); // 绘制白色背景 painter.fillRect(QRect(0, 0, width, height), Qt::white); float x 0; for(int i0; ibarcode.length(); i) { float w barcode[i] * lineWidth; if(i % 2 0) { // 绘制黑条 painter.fillRect(QRectF(x, 0, w, height), Qt::black); } x w; }实际项目中我遇到过两个坑条码太密集导致扫描器无法识别 - 需要适当增加绘制高度某些扫描器对左右空白区有要求 - 需要在两端留出足够空白5. 实现QR二维码生成5.1 生成二维码数据QRencode的使用稍微复杂些QString text https://example.com; QRcode* qrcode QRcode_encodeString(text.toUtf8().constData(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);参数说明2: 版本号0表示自动选择QR_ECLEVEL_Q: 纠错级别QR_MODE_8: 编码模式1: 是否区分大小写5.2 绘制二维码到界面二维码绘制要考虑缩放问题int qrWidth qrcode-width; float cellSize targetSize / qrWidth; for(int y0; yqrWidth; y) { for(int x0; xqrWidth; x) { if(qrcode-data[y*qrWidth x] 1) { painter.fillRect(QRectF(x*cellSize, y*cellSize, cellSize, cellSize), Qt::black); } } }为了提高识别率我通常会增加4px的白色边框在复杂背景下添加对比边框避免缩放导致像素模糊6. 高级功能与优化6.1 动态调整条码尺寸在实际应用中经常需要根据容器大小自动调整条码尺寸。我的做法是void resizeBarcode() { int w ui-label-width(); int h ui-label-height(); QImage scaled originalImage.scaled(w, h, Qt::KeepAspectRatio, Qt::FastTransformation); ui-label-setPixmap(QPixmap::fromImage(scaled)); }6.2 添加容错处理条码生成可能失败必须添加错误处理if(!qrcode) { qDebug() 生成二维码失败: QRcode_APIVersionString(); return; }对于Code128要注意它不支持中文如果输入中文需要提前转换QString encoded text.toLatin1(); if(encoded ! text) { qWarning() Code128不支持中文已自动过滤; }7. 实际应用中的经验分享在电商系统中我们同时使用两种条码商品SKU用Code128编码因为扫描速度快商品详情页链接用QR编码方便手机扫码性能方面在i5处理器上测试Code128生成1000个条码耗时约120msQR二维码(版本2)生成100个耗时约300ms遇到过一个典型问题某仓库扫描器无法识别生成的Code128码。后来发现是条高不足将高度从20px调整到50px后解决。这也提醒我们生成条码时要考虑实际使用场景的硬件限制。

更多文章