QT生成二维码

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);
}


1.4.5.centos7下编译运行

在这里插入图片描述

1.4.6.Windows下编译运行

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_S_Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值