目录
- 使用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()
对二维码进行解码
优缺点
- 不能设置背景和颜色
- 可以对生成的二维码进行解码