基于目前项目中可能需要用到二维码生成和读取,再此研究了一下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_HPP
cpp
#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中,但是加入图片后好像扫描不出,或者有些问题,希望有人知道可以指点一二
看下效果图:
原文:http://blog.csdn.net/esonpo/article/details/22289017