基于目前项目中可能需要用到二维码生成和读取,再此研究了一下qrencode和zxing,主要来源Libqrencode和QZXing,一个编码 一个解码
基于Mac osx平台
首先下载qrencode源码,解压到cd到其路径,执行./configure命令,具体可以网上查阅或者源码里面的readme有相关说明,make make install 他会执行安装到相关目录
更加详细的资料库请查看 开源QR码使用
直接上代码
Qt5.2.1 Mac Osx平台
项目pro加入:
LIBS += -L/usr/local/lib -lqrencode INCLUDEPATH += /usr/local/include有个类专门处理二维码:
#ifndef QRWIDGET_HPP #define QRWIDGET_HPP #include <QWidget> #include <QPushButton> #include <QLabel> class QRWidget : public QWidget{ Q_OBJECT private: QString data; public: explicit QRWidget(QWidget *parent = 0); void setQRData(QString data); protected: void paintEvent(QPaintEvent *); }; #endif // QRWIDGET_HPPcpp
#include "QRWidget.h" #include <QPainter> #include <QDebug> #include <qrencode.h> QRWidget::QRWidget(QWidget *parent) : QWidget(parent), data("Hello QR")//Note: The encoding fails with empty string so I just default to something else. Use the setQRData() call to change this. { } void QRWidget::setQRData(QString data){ this->data=data; update(); } void QRWidget::paintEvent(QPaintEvent *pe){ QPainter painter(this); //NOTE: I have hardcoded some parameters here that would make more sense as variables. QRcode *qr = QRcode_encodeString(data.toStdString().c_str(), 1, QR_ECLEVEL_L, QR_MODE_8, 0); if(0!=qr){ QColor fg("black"); QColor bg("white"); painter.setBrush(bg); painter.setPen(Qt::NoPen); painter.drawRect(0,0,width(),height()); painter.setBrush(fg); const int s=qr->width>0?qr->width:1; const double w=width(); const double h=height(); const double aspect=w/h; const double scale=((aspect>1.0)?h:w)/s; for(int y=0;y<s;y++){ const int yy=y*s; for(int x=0;x<s;x++){ const int xx=yy+x; const unsigned char b=qr->data[xx]; if(b &0x01){ const double rx1=x*scale, ry1=y*scale; QRectF r(rx1, ry1, scale, scale); painter.drawRects(&r,1); } } } QRcode_free(qr); } else{ QColor error("red"); painter.setBrush(error); painter.drawRect(0,0,width(),height()); qDebug()<<"QR FAIL: "<< ("errno"); } QLabel* lb = new QLabel(this); lb->resize(50,50); lb->move((this->width()-50)/2,(this->height()-50)/2); QPixmap pe1("/Users/toby/Desktop/xxoo/Qt-App/WeixinPC/512.png"); QPixmap tmp =pe1.scaled(50,50,Qt::IgnoreAspectRatio); lb->setPixmap(tmp); lb->show(); // QRectF target((this->width()-50)/2,(this->height()-50)/2, 50, 50); // QRectF source(0, 0, 50, 50); // QImage img("/Users/toby/Desktop/xxoo/Qt-App/WeixinPC/128.png"); // QImage tmpImg = img.scaled(50,50,Qt::IgnoreAspectRatio); // painter.drawImage(target,tmpImg,source); // painter.end(); qr=0; }
另外在生成二维码的同时可以加入一个logo,在paintevent中,但是加入图片后好像扫描不出,或者有些问题,希望有人知道可以指点一二
看下效果图:
问题找到了是编码的时候需要设置一下容错等级,开始写的是容错等级最低,这样加入图片的话,再软件扫描的时候,扫不出来的,将等级调到中等即可
QR_ECLEVEL_Q
呵呵 共享