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