个人技术分享

使用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_H

HEADERS += \
        mainwindow.h \
    qrencode.h
    
LIBS += -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_GENERIC

LIBS += -L$$PWD/QZXingDebug/ -lQZXing3

DEPENDPATH += $$PWD

HEADERS += \
        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);
    //可选设置,赋值自文档demo
    decoder.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()

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

在这里插入图片描述

优缺点

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