Qt开源库之----qrencode

目录

1.简介

2.使用

3.解决无法打开包括文件: “getopt.h”: No such file or directory的问题

4.生成二维码图片

5.最终效果:

6.源码


1.简介

官网:https://fukuchi.org/works/qrencode/

Libqrencode 是一个快速紧凑的库,用于在 QR 码符号中编码数据,这是一个 2D 符号系统,可由方便的终端(如带 CCD 的手机)进行扫描。QR 码容量高达 7000 位或 4000 个字符,具有很高的鲁棒性。

Libqrencode 接受一个字符串或数据块列表,然后在 QR Code 符号中编码为位图数组。当其他 QR 码应用程序生成图像文件时,使用 libqrencode 允许应用程序直接从原始位图数据中呈现 QR 码符号。此库还包含命令行实用程序输出各种格式的 QR 码图像。

2.使用

去官网下载源码包,我这里使用最新的稳定版本qrencode-4.1.0,解压qrencode-4.1.0.tar.gz,新建一个Qt Widgets Application工程qrcodeDemo,然后执行以下步骤:

(1)将源码中的config.h.in文件修改成config.h;

(2)将qrencode源码中的(*.h  *.c)加入到工程中(右键添加现有文件);

(3)在工程的pro文件中添加宏定义DEFINES += HAVE_CONFIG_H;

(4)在config.h中重新定义 MAJOR_VERSION、MICRO_VERSION、MINOR_VERSION、VERSION,重新定义的方法:找到#undef MAJOR_VERSION位置,在其下面定义#define MAJOR_VERSION 1,其他几个也这么定义;如下图所示:

修改完成后,就可以用qrencode库来生成二维码了,在mainwindow.cpp中引入qrencode.h头文件,在构造函数中调用二维码生成函数即可;如下图:

3.解决无法打开包括文件: “getopt.h”: No such file or directory的问题

编译时,会遇到getopt.h找不到的问题,是因为qrenc.c文件中引用了该头文件写了一个测试的main函数,并且只有该文件中用到了getopt.h头文件,所以直接屏蔽相关调用的地方即可,如下图所示:

(1)屏蔽头文件

(2)屏蔽结构体:

(3)屏蔽main函数

屏蔽完成后即可编译成功。 

4.生成二维码图片

使用QT的QPainter来完成二维码图片的绘制,在mainwindow.ui中添加一个QLabel,使用如下函数即可生成二维码图片:

void MainWindow::GenerateQRcode(QString tempstr)
{
    QRcode *qrcode; //二维码数据
    //QR_ECLEVEL_Q 容错等级
    qrcode = QRcode_encodeString(tempstr.toStdString().c_str(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);
    qint32 temp_width=ui->label->width(); //二维码图片的大小
    qint32 temp_height=ui->label->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;
    QImage mainimg=QImage(temp_width,temp_height,QImage::Format_ARGB32);
    QPainter painter(&mainimg);
    QColor background(Qt::white);
    painter.setBrush(background);
    painter.setPen(Qt::NoPen);
    painter.drawRect(0, 0, 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(x * scale_x, y * scale_y, scale_x, scale_y);
                painter.drawRects(&r, 1);
            }
        }
    }
    QPixmap mainmap=QPixmap::fromImage(mainimg);
    ui->label->setPixmap(mainmap);
    ui->label->setVisible(true);
}

5.最终效果:

6.源码

GitHub:https://github.com/liupeng2015bj/open-source-library.git,欢迎star。。。 

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

书灯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值