Qt + QR-Code-generator 生成二维码

2023-11-07

0.前言

之前使用 libgrencode 生成二维码,LGPL 协议实在不方便,所以需要找一个 github 星星多的,代码简单最好 header-only,协议最好是 MIT 或者兼容协议而不是 GPL 或者 LPGL。

QR-Code-generator 正好符合这个要求,而且还提供 C / C++ / Java / Python / JS / Rust 等 6 种语言实现,直接把 qrcodegen.hpp / cpp 类文件放到我们项目里就能使用。

库链接:https://github.com/nayuki/QR-Code-generator

库官网:https://www.nayuki.io/page/qr-code-generator-library

1.基本使用 

测试代码链接:https://github.com/gongjianbo/MyTestCode/tree/master/Qt/TestQt_20230711_QRCodeGen

效果展示:

 

测试代码:

void MainWindow::generate()
{
    // 使用utf8编码
    QByteArray str = ui->lineEdit->text().toUtf8();
    const char *text = str.constData();

    // 二维码有四个纠错等级,从低到高:L-%7/M-%15/Q-%25/H-%30
    const qrcodegen::QrCode::Ecc level = qrcodegen::QrCode::Ecc::MEDIUM;

    // 生成二维码
    try
    {
        // 使用简易接口,默认 Version 范围 min=1, max=40
        // const qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(text, level);
        // 也可以指定符号版本,越大可容纳的信息越多,如果内容超出容量范围会抛异常
        // 根据规范,Version1 是 21x21,Version2 是 25x25,每增加一个Version,就比前一版本每边增加 4 个模块
        std::vector<qrcodegen::QrSegment> segs = qrcodegen::QrSegment::makeSegments(text);
        const qrcodegen::QrCode qr = qrcodegen::QrCode::encodeSegments(segs, level, 1, 40);
        const int size = qr.getSize();
        // 填充位图
        QImage image = QImage(size, size, QImage::Format_Grayscale8);
        for (int row = 0; row < size; ++row)
        {
            uchar *line_ptr = image.scanLine(row);
            for (int col = 0; col < size; ++col)
            {
                line_ptr[col] = (uchar)(qr.getModule(row, col) ? 0x00 : 0xFF);
            }
        }
        // 放大一点看得更清楚
        image = image.scaled(image.width() * 5, image.height() * 5);

        // 生成后可以用手机扫一扫识别文字内容,注意内容为空可能扫不出来
        ui->label->setPixmap(QPixmap::fromImage(image));
    }
    catch(std::invalid_argument e)
    {
        // 参数异常,如 minVersion > maxVersion
        qDebug() << "catch invalid_argument" << e.what();
    }
    catch(qrcodegen::data_too_long e)
    {
        // 内容太长
        qDebug() << "catch data_too_long" << e.what();
    }
}

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

Qt + QR-Code-generator 生成二维码 的相关文章

  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • QGraphicsScene::clear 不会改变 sceneRect

    我有一个 QGraphicsScene 场景 和 QGraphicsView graphicsView 我有一个画图的方法 当我需要重绘所有图形时 我调用这个方法 一切都好 但我意识到 scene gt clear 不会改变 sceneRe
  • QToolButton:更改菜单位置

    使用菜单时QToolButton菜单显示在按钮的正下方 有没有办法在按钮的左侧 右侧显示菜单 我知道这个问题不久前已得到回答 但我想为此问题添加新答案 因为接受的答案不再有效 实际上 更改 QToolButton 上的菜单位置非常容易 您需
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • Qt:在多个布局中使用一个小部件

    我有一个 QTabBar 所有选项卡都应该有相同的小部件 layout1 gt addWidget w layout2 gt addWidget w 然而打电话addWidget第二次导致该小部件在第一个布局中消失 有没有办法使用一个小部件
  • 如何检测QTableView中的双击

    我正在使用 PyQt 创建 GUI 应用程序 在继承自 QTableView 的视图中 需要检测用户双击行时选择的行 该表可以排序 但不能编辑 我该怎么做 注意 尝试了 doubleClicked int 信号 它是由鼠标按钮发出的 而不是
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 在高 dpi Windows 平台上自动重新缩放应用程序?

    我正在编写一个需要在高 dpi Windows 192dpi 而不是 96dpi 上运行的 Qt 应用程序 不幸的是 Qt 框架尚不支持高 dpi 至少在 Windows 上 因此我的应用程序及其所有元素看起来只有应有尺寸的一半 有没有办法
  • Qt 5.3 无法使 QCompass (QSensor) 在 Windows 8.1 上工作

    我无法让传感器在我的 Asus Transformer T100 上工作 磁力计和指南针无法启动 并且我从加速度计获得假值 始终 x 0 y 9 8 z 0 即使使用我的笔记本电脑 我总是得到相同的结果 第一段文字编辑 Initialisa
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 如何在qt中创建正确的退出按钮

    我正在尝试创建一个退出按钮来正确关闭我在 QT 中制作的 GUI 我尝试通过以下方式执行此操作 include
  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk
  • 使用 PyQt 和 matplotlib 在可滚动小部件中显示多个绘图

    由于我没有得到答案this https stackoverflow com questions 12179893 creating a scrollable multiplot with pythons pylab我尝试用 PyQt 解决这
  • 为什么总是在 mouseDoubleClickEvent 之前调用 mousePressEvent

    请考虑以下代码 include
  • Qt:删除富文本

    对于明文有QFontMetrics elideText https doc qt io qt 5 qfontmetrics html elidedText https doc qt io qt 5 qfontmetrics html eli
  • 扩展 TabViewStyle styleData

    我目前正在尝试找到一种更好的方法来执行此操作 将图标添加到选项卡 现在 我正在放弃 styleData title 以包含图标源 但如果能够扩展 styleData 就更好了 这样我就可以包含其他自定义属性 这是我当前的黑客 Tab tit

随机推荐

  • 前端三件套原理遗忘复习(一)

    1 BOM事件 事件就是用户或浏览器自身执行的某种动作 事件可能是用户在某些内容上的点击 鼠标经 过某个特定元素或按下键盘上的某些按键 事件还可能是 Web 浏览器中发生的事情 比如说 某个 Web 页面加载完成 或者是用户滚动窗口或改变窗
  • 在切瓦片时transform的包围盒会偏移一个位置,查看这个是否需要在坐标上减去该值,或者直接用tmspackage

    这个用apply transfrom 即可 因为transform后面addChild的是整个几何体 关键是如何判断整体的包围盒 所有的几何体包围盒 这样四叉树或者八叉树才行 如果说对单个模型的八叉树切片是对drawable的切片 那么多个
  • Android解决调用JNI报java.lang.UnsatisfiedLinkError: No implementation found for的错误

    最近公司项目需求接入即时通讯功能 现在第三方的即时通讯做的比较完善 接入也很方便 最近在调试语音的时候遇到了一个 so库加载失败的问题 在网上查看都是说由于原有项目的so库和新添加的model的so库数量不一致 具体报错如下 java la
  • 认真分析mmap:是什么 为什么 怎么用

    mmap基础概念 mmap是一种内存映射文件的方法 即将一个文件或者其它对象映射到进程的地址空间 实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系 实现这样的映射关系后 进程就可以采用指针的方式读写操作这一段内存 而系统会自动
  • oracle delete了数据表,吓死我了!!

    我用的是第一种方法 华丽分割线 一 根据时间来恢复 1 查询数据库当前时间 目的是为了检查数据库时间是否与你电脑时间相近 避免时间不同而将数据恢复到错误时间点 select to char sysdate yyyy mm dd hh24 m
  • Datawhale-数据类型、关键字、标识符

    Go 语言的空格 Go 语言中变量的声明必须使用空格隔开 如 var age int 语句中适当使用空格能让程序更易阅读 无空格 fruit apples oranges 在变量与运算符间加入空格 程序看起来更加美观 如 fruit app
  • Spring Bean xml定义说明

    转自 Spring Bean xml定义说明 在前一篇文章中 我们知道了Spring IoC容器管理的对象称之为 Spring Bean Spring Bean根据配置文件或注解创建 那么这个配置文件该如何编写呢首先Spring Bean的
  • 区间预测

    区间预测 MATLAB实现基于QRCNN BiGRU卷积双向门控循环单元多变量时间序列区间预测 目录 区间预测 MATLAB实现基于QRCNN BiGRU卷积双向门控循环单元多变量时间序列区间预测 效果一览 基本介绍 模型描述 程序设计 参
  • 三种振幅调制AM、DSB、SSB

    1 调制与解调 调制 用调制信号去控制载波信号的某一个参量的过程 解调 调制的逆过程 即从已调波中恢复原调制信号 2 振幅调制AM AM调幅波的数学表达式 波形 频谱 单一频率信号的频谱 限带信号调幅波的频谱 AM信号的生成原理框图 调幅波
  • 【山河送书第四期】:《Python之光:Python编程入门与实战》参与活动,免费送书五本!!

    山河送书第四期 Python之光 Python编程入门与实战 参与活动 免费送书五本 书本简介 本书亮点 配套丰富 购买链接 参与方式 往期赠书回顾 书本简介 作为一种极其流行的编程语言 Python已经成为了当今最为重要的生产力工具之一
  • Error: Rule can only have one resource source (provided resource and test + include + exclude)

    前言 vue3 0报错记录 报错描述和过程 1 在使用vue3 0的时候 经常会报错 vue loader v16 找不到 2 在使用中发现一个很奇怪的问题 刚报错找不到 vue loader v16 我使用 cnpm i save vue
  • 计算机桌面无法中英文切换,解决中文和英文无法正常切换问题

    近日多特小编的电脑系统重装了 安装上搜狗拼音输入法后 使用以前常用按键 ctrl space 切换中英文输入法状态 发现无法切换到英文输入状态 小编从网上寻找解决方法时 发现很多网友都遇到这个问题 网上的解决方法都不能解决问题 于是小编 决
  • Ubuntu 学习笔记

    1 实时监视系统log输出 tail f var log syslog 2
  • 学习 Python 之 Pandas库

    学习 Python 之 Pandas库 Pandas库 什么是Pandas库 DataFrame 创建和存储 1 使用DataFrame构造函数 1 使用列表创建 2 使用字典创建 3 从另一个DataFrame对象创建 2 从文件读取 1
  • 【正则表达式】去除首尾空格

    function Trim str return str replace s s g
  • 【华为oj】蛇形矩阵

    问题描述 题目说明 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形 样例输入 5 样例输出 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 接口说明 原型 void GetResult int Num cha
  • GridLayout 居中显示

    GridLayout 居中显示 如果大家有使用过GridLayout来给RecyclerView使用 会发现其实是没有居中的 而官方也没有给出居中的方法 这里就讲讲如何让其居中 原理 要做的这一点其实很简单 只要我们自己计算每一个item的
  • 什么是 CSRF 、原理及其解决方式

    什么是 CSRF 跨站请求伪造 CSRF Cross site request forgery 也称为 XSRF Sea Surf 或Session Riding 是一个攻击向量 它欺骗 Web 浏览器在登录用户的应用程序中执行不需要的动作
  • selenium4新版本使用指南

    提示 本文默认你已经学会使用selenium的旧版本 因此对一些可以直接搜索到很多的内容 你应该是已经学会的 文章目录 前言 一 设置驱动 1 selenium4推荐方法 2 传统方法 二 查找元素 等待元素出现 三 动作API 暂停 pa
  • Qt + QR-Code-generator 生成二维码

    0 前言 之前使用 libgrencode 生成二维码 LGPL 协议实在不方便 所以需要找一个 github 星星多的 代码简单最好 header only 协议最好是 MIT 或者兼容协议而不是 GPL 或者 LPGL QR Code