Qt利用QZXing和QRenCode识别二维码和制作二维码

本文介绍了如何使用QRenCode和QZXing库在C++中实现二维码的生成与识别。首先,详细说明了下载和编译这两个库的过程,然后展示了如何在Qt环境中创建一个简单的用户界面,该界面可以生成二维码并实时显示识别结果。源代码中定义了一个RenderCodeLabel类用于绘制二维码,RenCodeDialog类则包含了输入框、按钮和显示标签,实现了从输入文本到二维码的转换和二维码的识别功能。
摘要由CSDN通过智能技术生成
制作二维码和识别二维码需要用到第三方库,制作需要用到QRenCode这个库,如果没
有的,大家可以在官网下载,或者去这个网址直接下载我编译好的两个库和头文件
[https://download.csdn.net/download/Pailugou/22253251] 下载下来用CMake进
行编译建立,如果报#include <getopt.h>这个头文件方面的不要管,将CMake建立
的工程打开,直接编译QRenCode就可以生成库,QZXing下载,可以用QCreater打开编
译生成库,部署到自己的工程中。

#pragma once
#include "QRenCode/qrencode.h"
#include "include/QZXing.h"
#include "include/QZXing_global.h"
#include <QWidget>
#include <QLabel>
#include <QPainter>
#include <QPaintEvent>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QPushButton>

//显示二维码的label
class RenderCodeLabel : public QLabel
{
	Q_OBJECT
public:
	explicit RenderCodeLabel(QWidget* parent = nullptr);

	void setRcode(QRcode* pRcode);
protected:
	void paintEvent(QPaintEvent* event);

private:
	QRcode* m_pRcode;
};

RenderCodeLabel::RenderCodeLabel(QWidget* parent)
	: QLabel(parent)
	, m_pRcode(nullptr)
{

}
void RenderCodeLabel::setRcode(QRcode* pRcode)
{
	m_pRcode = pRcode;
	update();
}

//用painter进行绘制二维码
void RenderCodeLabel::paintEvent(QPaintEvent* event)
{
	if (m_pRcode == nullptr)
		return;
	QPainter painter(this);
	painter.setRenderHint(QPainter::Antialiasing);

	QColor black(Qt::black);
	QColor white(Qt::white);
	painter.setBrush(white);
	painter.setPen(Qt::NoPen);
	painter.drawRect(0, 0, this->width(), this->height());
	painter.setBrush(black);
	const int rW = m_pRcode->width > 0 ? m_pRcode->width : 1;
	const double w = this->width();
	const double h = this->height();
	const double xScale = w / m_pRcode->width;
	const double yScale = h / m_pRcode->width;
	for (int y = 0; y<rW; y++) {
		const int yy = y*rW;
		for (int x = 0; x<rW; x++) {
			const int xx = yy + x;
			const unsigned char b = m_pRcode->data[xx];
			if (b & 0x01) {
				QRectF r(x*xScale, y*yScale, xScale, yScale );
				painter.drawRects(&r, 1);
			}
		}
	}
	QLabel::paintEvent(event);
}


class RenCodeDialog : public QWidget
{
	Q_OBJECT
public:
	explicit RenCodeDialog(QWidget* parent = nullptr);
		
	private slots:
	void createRenCode_slot();

	void showRcodeSub_slot();
private:
	RenderCodeLabel* m_pImageLabel;
	QLineEdit* m_pRenCodeStr;
	QLineEdit* m_pShowCodeStr;
	QPushButton* m_pOkButton;
	QRcode* m_pRcode;
};

RenCodeDialog::RenCodeDialog(QWidget* parent)
	: QWidget(parent)
	, m_pImageLabel(new RenderCodeLabel)
	, m_pRenCodeStr(new QLineEdit)
	, m_pShowCodeStr(new QLineEdit)
	, m_pOkButton(new QPushButton(tr("确定")))
	, m_pRcode(nullptr)
{
	this->resize(400, 400);
	m_pRenCodeStr->setPlaceholderText(tr("请输入二维码内容"));
	m_pShowCodeStr->setPlaceholderText(tr("显示二维码内容"));
	QVBoxLayout* pVBox = new QVBoxLayout;
	pVBox->setMargin(0);
	pVBox->addWidget(m_pImageLabel);
	pVBox->addWidget(m_pRenCodeStr);
	pVBox->addWidget(m_pShowCodeStr);
	pVBox->addWidget(m_pOkButton);
	this->setLayout(pVBox);

	connect(m_pOkButton, &QPushButton::clicked, this, &RenCodeDialog::createRenCode_slot);
}

void RenCodeDialog::createRenCode_slot()
{
//创建二维码数据指针,将其传给显示label
	QString recodeTr = m_pRenCodeStr->text();
	m_pRcode = QRcode_encodeString(recodeTr.toStdString().c_str(), 2, QR_ECLEVEL_Q, QR_MODE_8, 0);
	m_pImageLabel->setRcode(m_pRcode);

//生成二维码,过一秒钟进行识别
	QTimer::singleShot(1000, this, SLOT(showRcodeSub_slot()));
}

void RenCodeDialog::showRcodeSub_slot()
{
	QPixmap pixmap = QPixmap::grabWidget(m_pImageLabel, QRect(0, 0, m_pImageLabel->width(), m_pImageLabel->height()));
	QZXing zxing;
	zxing.setDecoder(QZXing::DecoderFormat_QR_CODE | QZXing::DecoderFormat_CODE_128);

	QString str = zxing.decodeImage(pixmap.toImage());
	m_pShowCodeStr->setText(str);
}

效果图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/bfaf69a998724e4fa15e79a852db45f3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAUGFpbHVnb3U=,size_13,color_FFFFFF,t_70,g_se,x_16)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pailugou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值