QT 调用QRencode库生成二维码和使用Code128生成简单条形码

目录导读

  • 前言
  • 使用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));
}

  • 界面示例:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/900560.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4K双模显示器7款评测报告

4K双模显示器7款评测报告 HKC G27H7Pro 4K双模显示器 ROG华硕 XG27UCG 4K双模显示器 雷神 ZU27F160L 4K双模显示器 泰坦军团 P275MV PLUS 4K双模显示器 外星人&#xff08;Alienware&#xff09;AW2725QF 4K双模显示器 SANC盛色 D73uPro 4K双模显示器 ANTGAMER蚂蚁电竞 …

lvgl

lvgl 目录 lvgl Lvgl移植到STM32 -- 1、下载LVGL源码 -- 2、将必要文件复制到工程目录 -- 3、修改配置文件 将lvgl与底层屏幕结合到一块 -- lvgl也需要有定时器&#xff0c;专门给自己做了一个函数&#xff0c;告诉lvgl经过了多长时间&#xff08;ms&#xff08;毫秒&a…

第三十篇:TCP连接断开过程,从底层说明白,TCP系列五

上一篇《第二十九篇&#xff1a;图解TCP三次握手&#xff0c;看过不会忘&#xff0c;从底层说清楚&#xff0c;TCP系列四》说了TCP的三次握手&#xff0c;接下来我将讲解TCP四次挥手。 既然有连接就有断开&#xff0c;谈到这里&#xff0c;有的同学可能会想&#xff0c;不就是…

log4j 和 logback 冲突解决

很多springboot starter自带logback 如果我们要用log4j就要把logback排除掉 点idea的maven侧栏工具的分析依赖关系 然后我们要选中我们有冲突的模块&#xff0c;搜索logback 这时候我们发现有logback相关的依赖&#xff0c;在点一下&#xff0c;我们就在右边发现&#xff0c;原…

STM32--I2C通信

对于I2C通信会分为两大块来讲解&#xff0c;第一块,就是介绍协议规则,然后用软件模拟的形式来实现协议&#xff0c;第二块,就是介绍STM32的12C外设,然后用硬件来实现协议&#xff0c;因为12C是同步时序,软件模拟协议也非常方便。 在学12C之前,我们已经学习了串口通信&#xff…

openlayers 封装加载本地geojson数据 - vue3

Geojson数据是矢量数据&#xff0c;主要是点、线、面数据集合 Geojson数据获取&#xff1a;DataV.GeoAtlas地理小工具系列 实现代码如下&#xff1a; import {ref,toRaw} from vue; import { Vector as VectorLayer } from ol/layer.js; import { Vector as VectorSource } fr…

蓄电池在线监测系统 各大UPS铅酸蓄电池监测 保障安全

蓄电池的不断普及&#xff0c;确实推动了蓄电池监控和管理技术的持续升级。蓄电池检测系统的研发为我们带来了诸多好处&#xff0c;这些好处主要体现在以下几个方面&#xff1a; 一、提高蓄电池管理的智能化水平 蓄电池检测系统通过实时监测蓄电池的电压、电流、温度等关键参数…

ZEISS ATOS Q蓝光三维扫描仪高效把控零件质量检测【上海沪敖3D】

位于Bengaluru的施耐德电气工厂拥有一流的计量设备&#xff0c;可以检测所有供应商的零件。当时&#xff0c;他们在使用一款激光扫描设备进行质量检测&#xff0c;但是&#xff0c;该设备不便于携带&#xff0c;且检测时需要喷涂大量的显影液。此外&#xff0c;它需要被安装在夹…

docker基础使用创建固定硬盘大小为40G的虚拟机

在docker中创建的服务器&#xff0c;匹配出容器id&#xff0c;服务器ip&#xff0c;服务器核数&#xff0c;服务器内存&#xff0c;服务器硬盘空间 for i in $(docker ps | grep -aiE web | awk {print $1});do echo $i; docker inspect $i|grep -aiE ipaddr|tail -1|grep -ai…

医院信息化与智能化系统(7)

医院信息化与智能化系统(7) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应的…

最新PHP网盘搜索引擎系统源码 附教程

最新PHP网盘搜索引擎系统源码 附教程&#xff0c;这是一个基于thinkphp5.1MySQL开发的网盘搜索引擎&#xff0c;可以批量导入各大网盘链接&#xff0c;例如百度网盘、阿里云盘、夸克网盘等。 功能特点&#xff1a;网盘失效检测&#xff0c;后台管理功能&#xff0c;网盘链接管…

使用freemarker实现在线展示文档功能开发,包括数据填充

首先&#xff0c;在这个独属于程序员节日的这一天&#xff0c;祝大家节日快乐【求职的能找到心仪的工作&#xff0c;已经工作的工资翻倍】。 ---------------------------------------------------------------回到正文-----------------------------------------------------…

状态栏黑底白字后如何实现圆角以及固定状态栏

如何实现如下效果: 上述是将状态栏实现黑底白字+圆角+状态栏固定的逻辑 具体代码patch如下: From 6a3b8ed5d3f49a38d8f9d3e488314a66ef5576b8 Mon Sep 17 00:00:00 2001 From: andrew.hu <andrew.hu@quectel.com> Date: Fri, 18 Oct 2024 16:43:49 +0800 Subject: [P…

Next.js14快速上手

文章目录 ***客户端***什么是Next项目在线地址官方文档项目创建查看项目目录结构app属于根目录 ***服务端***vercel数据库prisma 客户端 什么是Next Next.js 是一个用于构建全栈 Web 应用程序的 React 框架。您可以使用 React Components 来构建用户界面&#xff0c;并使用 Ne…

Unity引擎:游戏开发的核心力量

目录 引言 Unity引擎的发展历程 早期发展 跨平台支持 Unity引擎的核心特性 易用性 社区支持 跨平台能力 Unity在游戏开发中的应用 移动游戏 独立游戏 3A游戏 Unity的未来展望 高级图形和渲染技术 扩展现实&#xff08;XR&#xff09;支持 云服务和多人游戏 结论…

excel中,将时间戳(ms或s)转换成yyyy-MM-dd hh:mm.ss或毫秒格式

问题 在一些输出为时间戳的文本中&#xff0c;按照某种格式显示更便于查看。 如下&#xff0c;第一列为时间戳(s)&#xff0c;第二列是转换后的格式。 解决方案&#xff1a; 在公式输入框中输入&#xff1a;yyyy/mm/dd hh:mm:ss TEXT((A18*3600)/8640070*36519, "yyy…

Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks

Abstract 图像到图像转换是一类视觉和图形问题&#xff0c;其目标是使用对齐图像对的训练集来学习输入图像和输出图像之间的映射。 然而&#xff0c;对于许多任务&#xff0c;配对训练数据将不可用。 我们提出了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y …

Android 15自定义设置导航栏与状态栏,EdgeToEdge适配

背景&#xff1a;android api 35&#xff0c;activity设置EdgeToEdge.enable((ComponentActivity) this)前提下 一、设置导航栏与状态栏颜色 设置的状态栏颜色&#xff0c;只需要设置fitsSystemWindows跟setOnApplyWindowInsetsListener xml设置&#xff1a; 代码&#xff1a;…

没有AWS账号能不能在手机上使用AWS服务吗?

关于“没有AWS账号能不能在手机上使用AWS服务”这个问题&#xff0c;答案是不行的。要使用AWS&#xff08;亚马逊云服务&#xff09;提供的云服务&#xff0c;无论是在电脑还是手机上&#xff0c;都必须先创建一个AWS账号。AWS提供的各种云计算资源&#xff0c;比如EC2&#xf…

51单片机——OLED显示图片

取模软件&#xff1a;链接:https://pan.baidu.com/s/1UcrbS7nU4bsawNxsaaULfQ 提取码:gclc 1、如果图片大小和格式不合适&#xff0c;可以先用Img2Lcd软件进行调整图片大小&#xff0c;一般取模软件使用的是.bmp图片&#xff0c;可以进行输出.bmp格式。软件界面如下&#xff1…