Qt生成二维码

首先需要了解的是,二维码就是以01矩阵图的形式存储的字符串而已,就像我们扫描的网址类型的二维码,扫出来通过解析器其实就是一个url链接。关于其他的说明就自己百度了。
此处使用的是开源库qrencode来进行测试,类似的还有zxing或者qt自带的qzxing库。
1)先下载相关文件:http://download.openpkg.org/components/cache/qrencode/
下载好后,解压到自己的工程文件夹中
然后将config.h.in文件的.in删去,并且在此文件底部添加

#define MAJOR_VERSION 1
#define MICRO_VERSION 1
#define MINOR_VERSION 1
#define VERSION 1

然后还要删除qrenc.c文件,因为里面有main函数会产生冲突
2)此外还需要在qt工程中添加所有.c和.h文件,否则无法正确读取到文件
3)在.pro文件中添加:INCLUDE+=qrencode//此处是你存放库文件的目录名称
DEFINES+=HAVE_CONFIG_H
现在就可以在项目中#include来使用了
下面是生成二维码的使用例:
大致流程:将str转为code->处理宽高->根据伪二维数组data(即二维码数据矩阵)来绘制实际图片

//此处tempstr就是要转成二维码的具体数据data,label是最终显示二维码
void Widget::GenerateQRcode(QString tempstr,QLabel* label)
{
    QRcode *qrcode; //二维码对象
    //将str转化为const char * |2-QR码版本为2 | QR_ECLEVEL_Q 容错等级 |QR_MODE_8 八字节数据 |1-区分大小写
    //这一步也就是将str转为了二维数据矩阵
    qrcode = QRcode_encodeString(tempstr.toStdString().c_str(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);
    //此处将二维码显示在label上,所以还有对缩放比例的处理,若不管这点则直接定义一个宽高即可
    qint32 temp_width=label->width(); //显示二维码所用的QLabel大小,也可以说是显示大小
    qint32 temp_height=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);//最终生成的image对象
    QPainter painter(&mainimg);//借助painter来生成image
    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 ++)//qrcode->data实际是一个存了qrcode_width*qrcode_width个数据的一维数组
    //qrcode->data就是一个只含01的数组,0就是白,1就是黑
    //但这里要把这个一维数组以每行qrcode_width个数据、每列qrcode_width个数据的二维数组来使用
    {//绘制流程就是像遍历一个二维数组,每个点即变量b不是0就是1,0不绘制,1就绘制
        for(qint32 x = 0; x < qrcode_width; x++)
        {
            unsigned char b = qrcode->data[y * qrcode_width + x];
            if(b & 0x01)//根据二维码中黑白点(1/0),以缩放比例画出二维码
            {
                QRectF r(x * scale_x, y * scale_y, scale_x, scale_y);
                painter.drawRects(&r, 1);
            }
        }
    }
    QPixmap mainmap=QPixmap::fromImage(mainimg);
    label->setPixmap(mainmap);
    label->setVisible(true);
}

你可能感兴趣的:(QT,qt)