文章目录
1.基于第三方库libqrencode,Qt本地生成二维码
1.1.效果图
1.2.QR码简介
QR码(全称为快速响应矩阵码;英语:Quick Response Code)是二维条码的一种,于1994年由日本DENSO WAVE公司发明。QR来自英文Quick Response的缩写,即快速反应,因为发明者希望QR码可以让其内容快速被解码。QR码使用四种标准化编码模式(数字,字母数字,字节(二进制)和汉字)来存储数据。QR码最常见于日本,为目前日本最流行的二维空间条码。QR码比较普通条码可以存储更多数据,也无需要像普通条码般在扫描时需要直线对准扫描仪。因此其应用范围已经扩展到包括产品跟踪,物品识别,文档管理,营销等方面。
1.3.第三方库libqrencode下载
1.4.在自己的项目中使用,这里提供一个例子
1.4.1.新建一个工程
1.4.2.加入第三方库libqrencode
pro文件增加:
include ($$PWD/qrencode-4.1.1/qrencode.pri)
项目目录:
注意,使用cmake来搞也可以,生成结果如下图:
1.4.3.qrencode.pri
INCLUDEPATH += $$PWD
FORMS += \
HEADERS += \
$$PWD/bitstream.h \
$$PWD/config.h \
$$PWD/mask.h \
$$PWD/mmask.h \
$$PWD/mqrspec.h \
$$PWD/qrencode.h \
$$PWD/qrencode_inner.h \
$$PWD/qrinput.h \
$$PWD/qrspec.h \
$$PWD/rsecc.h \
$$PWD/split.h
SOURCES += \
$$PWD/bitstream.c \
$$PWD/mask.c \
$$PWD/mmask.c \
$$PWD/mqrspec.c \
$$PWD/qrencode.c \
$$PWD/qrinput.c \
$$PWD/qrspec.c \
$$PWD/rsecc.c \
$$PWD/split.c
1.4.4.使用
#include <QPainter>
#include <QLabel>
#include <QDebug>
#include "qrencode-4.1.1/qrencode.h"
#include "DlgMain.h"
#include "ui_DlgMain.h"
DlgMain::DlgMain(QWidget *parent)
: QDialog(parent)
, ui(new Ui::DlgMain)
{
ui->setupUi(this);
}
DlgMain::~DlgMain()
{
delete ui;
}
void DlgMain::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::black);
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* pQrlabel = new QLabel();
pQrlabel->setWindowFlags(Qt::WindowCloseButtonHint);
pQrlabel->setAttribute(Qt::WA_QuitOnClose, false);
pQrlabel->setPixmap(mainmap);
pQrlabel->setVisible(true);
pQrlabel->setToolTip(strUrl);
pQrlabel->setWindowTitle("本地生成二维码:" + strUrl);
mainmap.save(QCoreApplication::applicationDirPath() + "\\qrcode_local.jpg",Q_NULLPTR, 100);
}