制作二维码和识别二维码需要用到第三方库,制作需要用到QRenCode这个库,如果没
有的,大家可以在官网下载,或者去这个网址直接下载我编译好的两个库和头文件
[https:
行编译建立,如果报#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>
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();
}
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()
{
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: