使用QT生成二维码的两种方式

news/2024/10/22 11:13:41/

目录

  • 使用QRenCode生成二维码
    • 编译生成QRenCode库
    • 使用QRenCode
    • 结果演示
    • 优缺点:
  • 使用QZXing进行二维码的编码和解码
    • 编译源码
    • 使用QZXing库
    • 运行结果
    • 优缺点

使用QRenCode生成二维码

编译生成QRenCode库

QRenCode开源库

下载好之后使用cmake-gui打开进行构建生成。
在这里插入图片描述点击configure选择编译器和平台,我这里选择vs2022+x64

在这里插入图片描述

点击"Add Entry",Name填写CMAKE_DEBUG_POSTFIX,Type选择string,value填写d,表示生成debug时带有d后缀

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
勾选这两个地方,点击generate

这是生成后的内容:

在这里插入图片描述
使用vs打开进行生成,右键install生成

在这里插入图片描述这是生成路径,debug和release都生成。

在这里插入图片描述之后在这个生成路径下会找到头文件、动态库和静态库。

在这里插入图片描述在这里插入图片描述

使用QRenCode

使用qt creator新建一个项目,然后将刚刚的动态库、静态库、头文件拷贝到这个项目中

在这里插入图片描述
.pro文件添加以下内容:

DEFINES += QT_DEPRECATED_WARNINGS HAVE_CONFIG_HHEADERS += \mainwindow.h \qrencode.hLIBS += -L$$PWD/ -lqrencoded

ui文件我是这样布局的

在这里插入图片描述encode按钮是编码,decode是解码,但是qrencode生成的二维码貌似不能对其解码,不过可以使用QZXing库进行编码和解码,在下面会讲到。

// encode按钮槽函数,生成二维码
void MainWindow::on_pushButton_clicked()
{QString strUrl = ui->textEdit->toPlainText();QRcode *qrcode;qrcode = QRcode_encodeString(strUrl.toStdString().c_str(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);qint32 temp_width = 500;qint32 temp_height = 500;qDebug() << "temp_width=" << temp_width << ";temp_height=" << temp_height;qint32 qrcode_width = qrcode->width > 0 ? qrcode->width : 1;double scale_x = (double)temp_width / (double)qrcode_width;double scale_y = (double)temp_height / (double)qrcode_width;int offset = 14;QImage mainimg = QImage(temp_width + offset * 2, temp_height + offset * 2, QImage::Format_ARGB32);QPainter painter(&mainimg);QColor background(Qt::white);painter.setBrush(background);painter.setPen(Qt::NoPen);painter.drawRect(offset, offset, temp_width, temp_height);// 设置二维码颜色为蓝色QColor foreground(Qt::blue);painter.setBrush(foreground);for (qint32 y = 0; y < qrcode_width; y++){for (qint32 x = 0; x < qrcode_width; x++){unsigned char b = qrcode->data[y*qrcode_width + x];if (b & 0x01){QRectF r(offset + x * scale_x, offset + y * scale_y, scale_x, scale_y);painter.drawRects(&r, 1);}}}painter.setPen( QColor(0, 0, 255));painter.drawText(temp_width/2, temp_height+offset*2-2, strUrl);QPixmap mainmap = QPixmap::fromImage(mainimg);QLabel* m_pQrlabel = new QLabel();m_pQrlabel->setWindowFlags(Qt::WindowCloseButtonHint);m_pQrlabel->setAttribute(Qt::WA_QuitOnClose, false);m_pQrlabel->setPixmap(mainmap);m_pQrlabel->setVisible(true);m_pQrlabel->setToolTip(strUrl);m_pQrlabel->setWindowTitle("本地生成二维码:" + strUrl);// 保存二维码mainmap.save(QCoreApplication::applicationDirPath() + "\\qrcode_local.jpg",Q_NULLPTR, 100);
}

结果演示

随便输入一段内容,点击encode按钮进行生成,会生成一个二维码,这个二维码使用微信的扫一扫也可以扫描出内容。

在这里插入图片描述

优缺点:

  • 可以自定义二维码背景、颜色
  • 这种方式目前只能对文本生成二维码,图片、文档、音频这种我还没找到方法,欢迎大家指导
  • 这种方式貌似不能对生成的二维码进行解码

使用QZXing进行二维码的编码和解码

编译源码

QZXing源码链接

在这里插入图片描述

使用qt creator打开src里的.pro进行构建,我这边的环境是Qt 5.9.1 + msvc2017_x64构建可以成功,msvc2015_x64失败。

分别选择debug和release进行构建,会生成对应的动态库和静态库。

使用QZXing库

使用Qt Creator新建一个项目,然后将生成的动态库和静态库拷贝到项目目录下,头文件选择这两个,这里使用debug的动态库进行演示。

在这里插入图片描述
我的工程目录:
在这里插入图片描述

在.pro文件添加

DEFINES += QT_DEPRECATED_WARNINGS QZXING_LIBRARY
DEFINES += ENABLE_ENCODER_GENERICLIBS += -L$$PWD/QZXingDebug/ -lQZXing3DEPENDPATH += $$PWDHEADERS += \mainwindow.h \QZXing.h \QZXing_global.h

ui文件这样布局
在这里插入图片描述
其中encode按钮是生成二维码,decode是对二维码进行解码。

包含头文件

#include "QZXing.h"
// encode按钮槽函数,编码生成二维码
void MainWindow::on_pushButton_clicked()
{img = QZXing::encodeData(ui->textEdit->toPlainText(),QZXing::EncoderFormat_QR_CODE);ui->label->setPixmap(QPixmap::fromImage(img));
}// decode按钮槽函数,对二维码解码
void MainWindow::on_pushButton_2_clicked()
{if(img.isNull())return;QZXing decoder;//QR Code二维码decoder.setDecoder(QZXing::DecoderFormat_QR_CODE);//可选设置,赋值自文档demodecoder.setSourceFilterType(QZXing::SourceFilter_ImageNormal);decoder.setTryHarderBehaviour(QZXing::TryHarderBehaviour_ThoroughScanning |QZXing::TryHarderBehaviour_Rotate);QString info = decoder.decodeImage(img);ui->textEdit->setPlainText("decode:" + info);
}

运行结果

生成二维码,二维码的大小可以控制,默认是240*240,参数设置在这个函数,其他参数貌似没什么用,可以使用微信扫一扫扫描。

QZXing::encodeData()

在这里插入图片描述
对二维码进行解码

在这里插入图片描述

优缺点

  • 不能设置背景和颜色
  • 可以对生成的二维码进行解码

http://www.ppmy.cn/news/1465883.html

相关文章

如何使用JavaScript获取当前URL?

在现代开发中,我们经常需要获取当前网页的URL来完成各种操作,例如页面重定向、参数解析等。在URL的处理上,JavaScript提供了一系列强大且便捷的工具。这篇文章将详细讲解如何使用JavaScript获取当前页面的URL,并分解URL的各个组成部分。 使用JavaScript获取完整的URL 获取…

2024华为OD机试真题-分割均衡字符串-C++(C卷D卷)

题目描述 均衡串定义: 字符串只包含两种字符,且两种字符的个数相同。 给定一个均衡字符串,请给出可分割成新的均衡子串的最大个数。 约定字符串中只包含大写的X和Y两种字符。 输入描述 均衡串: XXYYXY 字符串的长度[2,100001]。给定的字符串均为均衡串 输出描述 可分割为两个…

设计模式 22 访问者模式 Visitor Pattern

设计模式 22 访问者模式 Visitor Pattern 1.定义 访问者模式是一种行为型设计模式&#xff0c;它允许你在不改变已有类结构的情况下&#xff0c;为一组对象添加新的操作。它将算法与对象结构分离&#xff0c;使你能够在不修改现有类的情况下&#xff0c;为这些类添加新的操作。…

期权与股票在交易上是有什么区别吗?

国内的股票市场&#xff0c;只能做多&#xff0c;T1交易。期权则分为4个方向&#xff0c;买入看涨期权&#xff0c;买入看跌期权&#xff0c;也就是做多和做空T0双向交易&#xff0c;同时每个方向还区分不同的行权价&#xff0c;每个行权价对应的4个方向的期权&#xff0c;都有…

混合模型方差分析

文章目录 一、说明二、受试者“间”因素和受试者“内”因素的意思&#xff1f;三、混合模型方差分析回答 3 件事四、混合模型方差分析的假设 一、说明 在本文中&#xff0c;我将讨论一种称为混合模型方差分析的方差分析变体&#xff0c;也称为具有重复测量的 2 因素方差分析。…

Nodejs-- 网络编程

网络编程 构建tcp服务 TCP tcp全名为传输控制协议。再osi模型中属于传输层协议。 tcp是面向连接的协议&#xff0c;在传输之前需要形成三次握手形成会话 只有会话形成了&#xff0c;服务端和客户端才能想发送数据&#xff0c;在创建会话的过程中&#xff0c;服务端和客户…

详解 Spark核心编程之广播变量

广播变量是分布式共享只读变量 一、广播变量功能 ​ 广播变量用来将一个较大的数据对象发送到 Executor 并保存在内存中&#xff0c;同一个 Executor 中的所有 Task 都可以读取且只能读取广播变量中的数据&#xff0c;从而达到共享的目的&#xff0c;避免 Executor 中存在大量…

python 滑雪小游戏代码

以下是一个简化的滑雪小游戏代码示例&#xff0c;使用了Pygame库来创建窗口和处理用户输入 import pygame import random # 初始化Pygame pygame.init() # 设置窗口大小 width, height 800, 600 screen pygame.display.set_mode((width, height)) # 设置背景颜色 bg…