QT二维码生成和解析&Demo

2023-11-20

目录

一、前言

二、相关知识

三、效果展示

四、主要源码简析

五、源码Demo


一、前言

本文主要介绍二维码生成和解析的相关知识和例程

 

二、相关知识

①二维码生成:

主要用到的是开源的二维码QR码编码库qrencode,需要使用到的库文件为下面的:

库里最重要的是下面的二维码生成函数:

/*
string是生成二维码的字符串;
2表示二维码的版本,一般选1或2都可以;
QR_ECLEVEL_L表示容错级别,容错级别越高,相同的字符串生成的二维码就越复杂,相对应的识别二维码摄像头也就需求精度越高;
QR_MODE_8表示生成二维码数据的类型,一般选QR_MODE_8;
最后一个涉及到库生成二维码的一些判断,选0即可。
返回值是生成二维码的全部信息
*/
qr = QRcode_encodeString(string,2,QR_ECLEVEL_L,QR_MODE_8,0);

根据上面的函数可获得生成二维码的信息,还需将二维码的结构体信息,转换成图片,用QPainter处理即可。qr->data包含了二维码图像的信息,其中每个数据的bit0位代表了点的颜色,1表示黑色,0表示白色。画图时先将画布背景色设置为白色,然后将为1的点画成黑色,为0的点不画。

②二维码/条形码解析

主要用到的是QZXing,网上有很多现成的,我的Demo也提供,主要的二维码/条形码解析过程:

QZXing decoder;
//解析类型:CODE128条形码和二维码,可自选
decoder.setDecoder( QZXing::DecoderFormat_CODE_128 | QZXing::DecoderFormat_QR_CODE);
QString result = decoder.decodeImage(img);

 

三、效果展示

①二维码生成

②二维码/条形码解析

   

 

四、主要源码简析

①二维码生成

qrcodegenerate.h

#ifndef QRCODEGENERATE_H
#define QRCODEGENERATE_H

#include <QWidget>
#include "./qrencode/qrencode.h"
#include <QPainter>

namespace Ui {
class QrcodeGenerate;
}

class QrcodeGenerate : public QWidget
{
    Q_OBJECT

public:
    explicit QrcodeGenerate(QWidget *parent = 0);
    ~QrcodeGenerate();
    void generateString(const QString &str);
    bool saveImage(const QString &fileName, int size=250);

protected:
    void paintEvent(QPaintEvent *);
    QSize sizeHint() const;
    QSize minimumSizeHint() const;

private:
    Ui::QrcodeGenerate *ui;
    void draw(QPainter &painter, int width, int height);
    QRcode *qr;

};

#endif // QRCODEGENERATE_H

 qrcodegenerate.cpp

#include "qrcodegenerate.h"
#include "ui_qrcodegenerate.h"

QrcodeGenerate::QrcodeGenerate(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::QrcodeGenerate)
{
    ui->setupUi(this);
    qr = NULL;
}

QrcodeGenerate::~QrcodeGenerate()
{
    if(qr != NULL)
    {
       QRcode_free(qr);
       qr = NULL;
    }
    delete ui;
}
bool QrcodeGenerate::saveImage(const QString& fileName, int size)
{
    if(size != 0 && !fileName.isEmpty())
    {
        QImage image(size, size, QImage::Format_Mono);
        QPainter painter(&image);
        QColor background(Qt::white);
        painter.setBrush(background);
        painter.setPen(Qt::NoPen);
        painter.drawRect(0, 0, size, size);
        if(qr != NULL)
        {
            draw(painter, size, size);
        }
        return image.save(fileName);
    }
    else
    {
        return false;
    }
}

void QrcodeGenerate::generateString(const QString& str)
{
    if(qr != NULL)
    {
        QRcode_free(qr);
    }
    //2:生成二维码版本,建议选1或2;QR_ECLEVEL_L:容错级别;QR_MODE_8:生成data数据的类型
    qr = QRcode_encodeString(str.toStdString().c_str(),
                             2,
                             QR_ECLEVEL_L,
                             QR_MODE_8,
                             0);
    update();

}


void QrcodeGenerate::draw(QPainter &painter, int width, int height)
{
    QColor foreground(Qt::black);
    painter.setBrush(foreground);
    const int qr_width = qr->width > 0 ? qr->width : 1;
    double scale_x = width / qr_width;
    double scale_y = height / qr_width;
    for( int y = 0; y < qr_width; y ++)
    {
        for(int x = 0; x < qr_width; x++)
        {
            unsigned char b = qr->data[y * qr_width + x];
            //bit0位代表了点的颜色,1表示黑色,0表示白色,我们只要在白背景下画黑点
            if(b & 0x01)
            {
                QRectF r(x * scale_x, y * scale_y, scale_x, scale_y);
                painter.drawRects(&r, 1);
            }
        }
    }
}

//ui重绘事假
void QrcodeGenerate::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    //把背景设为纯白
    QColor background(Qt::white);
    painter.setBrush(background);
    painter.setPen(Qt::NoPen);
    painter.drawRect(0, 0, width(), height());
    if(qr != NULL)
    {
        draw(painter, width(), height());
    }
}

QSize QrcodeGenerate::sizeHint()  const
{
    QSize s;
    if(qr != NULL)
    {
        int qr_width = qr->width > 0 ? qr->width : 1;
        s = QSize(qr_width * 4, qr_width * 4);
    }
    else
    {
        s = QSize(50, 50);
    }
    return s;
}

QSize QrcodeGenerate::minimumSizeHint()  const
{
    QSize s;
    if(qr != NULL)
    {
        int qr_width = qr->width > 0 ? qr->width : 1;
        s = QSize(qr_width, qr_width);
    }
    else
    {
        s = QSize(50, 50);
    }
    return s;
}

 ②二维码/条形码解析

void MainWindow::on_pushButton_clicked()
{
    ui->lineEdit->clear();

    QString filename = QFileDialog::getOpenFileName(this,"file","./","any files(*.*)"";;any files(*.png)");
    QImage img;        //加载图像
    if(!(img.load(filename)))
    {
        QMessageBox::information(this,"Warning", "Open Picture fail!");
        return;
    }
    img = img.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio);
    ui->label->setPixmap(QPixmap::fromImage(img));

    QZXing decoder;
    //解析CODE128一维码和二维码
    decoder.setDecoder( QZXing::DecoderFormat_CODE_128 | QZXing::DecoderFormat_QR_CODE);
    QString result = decoder.decodeImage(img);
    if(result.isEmpty())
    {
        QMessageBox::about(this,"warning","Wrong picture format!");
        return;
    }

    ui->lineEdit->setText(result);
}

五、源码Demo

①二维码生成

链接:https://pan.baidu.com/s/1KNcebG_K_ARRkW1tMpbq8g 
提取码:844t

②二维码/条形码解析

链接:https://pan.baidu.com/s/1Cr-eBjd3XeADcv7yclvI7g 
提取码:fr4p

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT二维码生成和解析&Demo 的相关文章

  • 选择文件夹后 QFileDialog::getExistingDirectory 不关闭

    In Qt QFileDialog dlg new QFileDialog QDir dir dlg gt getExistingDirectory this tr Choose folder qgetenv HOME 打开文件夹选择对话框
  • qmake 和 QT_INSTALL_PREFIX。如何为 Qt 库选择新位置?

    我是 qmake 的新手 我正在尝试构建一个现有的应用程序 Qt 最初安装在 usr local lib Qt 4 3 5 中 qmake query QT INSTALL PREFIX 返回该路径 我已将 Qt 库移动到另一个位置 生成的
  • Qt 的最佳实践包括和预编译头文件?

    当使用现代和最新的 C 编译器 例如 MSVC2015 并激活预编译头时 当前关于包含 Qt 头文件的 最佳实践 是什么 Example include
  • 使用带有 MSVC 2015 编译器的 QT Creator 5.8

    我是新来的C 和编程 我正在尝试做一个小项目 使用Qt and Qt Creator 我当时用的是MinGW compiler 但对于这个项目 我需要与MSVC compiler 因为我需要使用QtWebEngineWidgets I ha
  • 包装 C++ Qt 小部件以便在 Python 中与 PySide 一起使用

    在 Python 中使用自定义 Qt 显示小部件包装自定义 C 库以便在基于 PySide 的 QApplication 中使用的最佳方法是什么 C 库是否需要特殊处理才能使用 SWIG 进行包装 封装的 Qt 小部件能否与 PySide
  • 使用 Poppler Qt4 C++

    我需要在我的应用程序中使用 pdf 查看器库 我使用 C 和 QT 我下载了Poppler http poppler freedesktop org 和代码示例Poppler Qt4 界面库 http people freedesktop
  • QMainWindow::showMaximized() 不更新大小

    我正在尝试创建一个QMainWindow封装一个QGraphicsView我把它放进去 我希望它一开始就最大化 所以我这样做 QMainWindow mainWindow new QMainWindow mainWindow gt setW
  • Qt 对象的生命周期

    Qt 对象的生命周期是多少 Such as QTcpSocket socket new QTcpSocket 套接字什么时候会被销毁 我应该使用 delete socket 有什么区别吗 QTcpSocket socket 我找不到有关此的
  • 如何在点击 Qtablewidget 单元格时获取放置在该单元格中的小部件的行号?

    我正在尝试的是当用户选择项目时获取 QcomboBox 的行号 虽然使用它很容易获得单元格的列和行 cellClicked int int 信号 但仅当单元格上没有小部件时才有效 那么如果单元格中放置了小部件 如何获取行号 Note 所有组
  • Mac OS X 文件关联有效,但文件图标未更改

    我使用 Qt 5 3 2 开发了一个 Mac 应用程序 该应用程序处理具有特定扩展名的文件 比方说 xyz 我创建了一个名为 XYZ icns 的图标文件 并将其添加到我的应用程序包资源文件夹中 MyApp app Contents Res
  • 删除 QComboBox“下拉”动画

    我正在使用 Qt 4 8 并且想在单击 QComboBox 时摆脱 下拉 动画 我也想稍微移动一下 到目前为止 我一直在考虑重新实现 showPopup 和 hidePopup 但不知道如何使其工作 此外 每次我尝试使用 CSS 进行移动或
  • Qt 信号槽,新符号中的转换类型[重复]

    这个问题在这里已经有答案了 鉴于以下两个 connect ui gt comboBox SIGNAL activated QString ps SLOT requestPlotsAvailable QString connect ui gt
  • 将项目添加到自定义组件的布局

    我有一个习惯Footer Component我想在 QML 应用程序的不同位置重用它 Rectangle color gold height 50 anchors bottom parent bottom left parent left
  • QT 应用程序运行时错误?

    我已经在 Windows 7 的 Qt5 1 上开发了一个应用程序 现在我想分发它 由于我使用了 MINGW 编译器 因此无法静态构建它 我使用dependency walker找出所有dll并打包 当我在未安装 QT 开发环境的计算机上运
  • 检查目录是否为空

    我正在尝试检查目录是否为空 MainWindow MainWindow QWidget parent QMainWindow parent ui new Ui MainWindow ui gt setupUi this QDir Dir h
  • 获取小部件的背景颜色 - 真的

    我无法获取小部件的实际背景颜色 在我的特殊情况下 我在使用 QTabWidget 中的小部件时遇到问题 这是在Windows7上 因此 经典的小部件有一些灰色背景 而选项卡内的小部件通常用白色背景绘制 I tried def bgcolor
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • qt项目如何设置安装路径

    我正在寻找与 qmake configure prefix 等效的内容 基本上 我想覆盖默认的安装 部署目录 这是如何用命令行 qmake 指定的 我还使用 QtCreator 构建了很多 gui 项目 并且我想知道如何在 QtCreato
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • 当 QML 对象不可见时防止 QML 属性绑定?

    我正在开发一个具有大量属性绑定的 QML 应用程序 数百个对象被跟踪并以不同的形式显示 例如 Qt3D QCanvas 当我在应用程序的单独页面上时 x y 位置和相对大小的属性绑定仍在发生 我怎样才能阻止他们 我知道我可以根据属性是否可视

随机推荐

  • Redis系列之发布订阅

    前言 通过Redis可以实现简单的消息 Redis为我们提供了一个发布订阅的功能 下面我们来认识下Redis的发布订阅 发布订阅模型 发布者将消息发布发布到channel频道上 所有订阅了channel频道的客户端都会接收到消息 如下图 相
  • 把思科端口速率改为不协商_端口汇聚—TRUNK技术介绍

    一 概述 随着网络技术的不断发展和应用 网络的速度越来越快 网络的应用也越来越复杂 因此在很多实际应用中网络速度就成为各种网络应用的瓶颈所在 通过升级来提高网络速度是解决问题的一个有效的手段 比如从10M以太网到100M以太网以至于1000
  • Tic-Tac-Toe(三子连)(总结规律)

    Time Limit 1000 mSec Memory Limit 262144 KB Problem Description Kim likes to play Tic Tac Toe Given a current state and
  • 基于灰度的模板匹配(带旋转角度)

    原图 选择模板 旋转180度进行识别 继续旋转 依然可以识别 代码 Searching the best matching of a template in an image with rotation dev close window r
  • STM32使用各传感器demo

    先挖个坑 待整理 语音播报部分 1 VS1053语音模块 2 JQ8400语音模块 智能小车部分 3 寻迹模块 4 避障模块 5 舵机驱动 6 超声波模块 7 L298N模块 8 蓝牙JD31模块 兼容HC 05 9 红外模块 10 MPU
  • 使用golang+antlr4构建一个自己的语言解析器(一)

    Antlr4 简介 ANTLR 全名 ANother Tool for Language Recognition 是基于LL 算法实现的语法解析器生成器 parser generator 用Java语言编写 使用自上而下 top down
  • 如何查看Tomcat版本信息

    一 简单暴力的 1 打开tomcat路径下的lib文件夹 找到catalina jar 用解压工具打开 找到 MANIFEST MF 打开就可以看到了 二 进入tomcat 安装路径 进入bin文件夹 对于version bat点击运行后会
  • STM32野火教程学习

    野火教程学习 全套200集视频教程和1000页PDF教程请到秉火论坛下载 www firebbs cn 野火视频教程优酷观看网址 http i youku com firege 第4章 初识STM32 零死角玩转STM32 F429系列 h
  • LaTeX 命令和代码结构简介

    目录 LaTeX LaTeX LATE X 命令和环境 命令 参数 环境 分组 LaTeX LaTeX
  • 【Linux应用】磁盘IO读写测试工具-FIO详解

    1 FIO简介 FIO是Linux下开源的一款IOPS测试工具 主要用来对磁盘进行压力测试和性能验证 它可以产生许多线程或进程来执行用户特定类型的I O操作 通过编写作业文件 类似于k8s的yaml 或者直接命令去执行测试动作 相当于是一个
  • linux 使用systemctl 启动服务报错: Error: No space left on device

    By default Linux only allocates 8192 watches for inotify which is ridiculously low And when it runs out the error is als
  • uni-app开发微信小程序数据 \n 换行符失效问题

    前言 使用uni app开发微信小程序时 使用text显示字符串 字符串带 n 需要在 n处直接换行 1 本地字符串 可以直接换行显示 2 后台返回字符串 直接换行失效 原因 渲染时 n 直接被当成字符串处理了 根本不识别 效果图 实现 1
  • pikachu靶场 RCE、File Inclusion

    目录 exec ping exec eval File Inclusion local File Inclusion remote exec ping 输入正常的ip地址看到正常回显 测试带管道符 能不能正常执行 发现可以 命令可以接各种命
  • C++中经常有set和get函数,那么他们有什么作用呢

    C 中经常有set和get函数 set和get函数的作用 由于成员变量我们一般设置为私有 在类外部不能直接访问 所以我们需要设计公有的set 函数和get 函数来访问它 set 函数是指修改私有成员变量的值的那类函数 get 函数是指输出
  • vue中用高德地图根据经纬度在地图上显示一个定位点

    在 Vue 中使用高德地图显示定位点 你需要做以下几件事 在项目中安装高德地图的 npm 包 npminstall save amap js api 在 main js 中引入高德地图的库并初始化 import AMapfrom amap
  • JSP——JavaBean的使用实例(求圆的面积)

    JSP页面通过表单输入圆半径并提交给该页面 表单提交后 JSP页面将计算圆面积和周长的任务交给一个JavaBean去完成 1 建立如下目录结构文件 2 Circle java 文件 package sun hebtu 求圆面积的Circle
  • JSP+ssm计算机毕业设计米哈游原神角色伤害计算系统xbn3e【源码、数据库、LW、部署】

    项目运行 项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEcl
  • ROS2报错 AttributeError: type object ‘type‘ has no attribute ‘_TYPE_SUPPORT‘

    问题描述 今天在用python写ROS2编写发布者和订阅者 然后需要用到自己的写的接口 在写完之后 使用colcon build并没有报错 并且可以使用ros2 interface show my interface指令查看到自己定义的接口
  • 用 IDEA+EmmyLua 来写神途脚本

    1 安装IntelliJ IDEA 下载地址 Download IntelliJ IDEA The Capable Ergonomic Java IDE by JetBrains 推荐安装 2022 1 4 版本 可使用社区版 2 安装 l
  • QT二维码生成和解析&Demo

    目录 一 前言 二 相关知识 三 效果展示 四 主要源码简析 五 源码Demo 一 前言 本文主要介绍二维码生成和解析的相关知识和例程 二 相关知识 二维码生成 主要用到的是开源的二维码QR码编码库qrencode 需要使用到的库文件为下面