首先需要了解的是,二维码就是以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<qrencode.h>来使用了
下面是生成二维码的使用例:
大致流程:将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来生成imageQColor 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);
}