转载自:http://www.it165.net/pro/html/201403/11101.html
基于目前项目中可能需要用到二维码生成和读取,再此研究了一下qrencode和zxing,主要来源Libqrencode和QZXing,一个编码 一个解码
基于Mac osx平台
首先下载qrencode源码,解压到cd到其路径,执行./configure命令,具体可以网上查阅或者源码里面的readme有相关说明,make make install 他会执行安装到相关目录
更加详细的资料库请查看 开源QR码使用
直接上代码
Qt5.2.1 Mac Osx平台
项目pro加入:
1.
LIBS += -L/usr/local/lib -lqrencode
2.
INCLUDEPATH += /usr/local/include
01.
#ifndef QRWIDGET_HPP
02.
#define QRWIDGET_HPP
03.
04.
#include <QWidget>
05.
#include <QPushButton>
06.
#include <QLabel>
07.
class
QRWidget :
public
QWidget{
08.
Q_OBJECT
09.
private
:
10.
QString data;
11.
public
:
12.
explicit QRWidget(QWidget *parent =
0
);
13.
void
setQRData(QString data);
14.
15.
protected
:
16.
void
paintEvent(QPaintEvent *);
17.
};
18.
19.
#endif
// QRWIDGET_HPP
01.
#include
"QRWidget.h"
02.
#include <QPainter>
03.
#include <QDebug>
04.
#include <qrencode.h>
05.
06.
QRWidget::QRWidget(QWidget *parent) :
07.
QWidget(parent),
08.
data(
"Hello QR"
)
//Note: The encoding fails with empty string so I just default to something else. Use the setQRData() call to change this.
09.
{
10.
}
11.
12.
void
QRWidget::setQRData(QString data){
13.
this
->data=data;
14.
update();
15.
}
16.
17.
void
QRWidget::paintEvent(QPaintEvent *pe){
18.
QPainter painter(
this
);
19.
//NOTE: I have hardcoded some parameters here that would make more sense as variables.
20.
QRcode *qr = QRcode_encodeString(data.toStdString().c_str(),
1
, QR_ECLEVEL_L, QR_MODE_8,
0
);
21.
if
(
0
!=qr){
22.
QColor fg(
"black"
);
23.
QColor bg(
"white"
);
24.
painter.setBrush(bg);
25.
painter.setPen(Qt::NoPen);
26.
painter.drawRect(
0
,
0
,width(),height());
27.
painter.setBrush(fg);
28.
const
int
s=qr->width>
0
?qr->width:
1
;
29.
const
double
w=width();
30.
const
double
h=height();
31.
const
double
aspect=w/h;
32.
const
double
scale=((aspect>
1.0
)?h:w)/s;
33.
for
(
int
y=
0
;y<s;y++){
34.
const
int
yy=y*s;
35.
for
(
int
x=
0
;x<s;x++){
36.
const
int
xx=yy+x;
37.
const
unsigned
char
b=qr->data[xx];
38.
if
(b &
0x01
){
39.
const
double
rx1=x*scale, ry1=y*scale;
40.
QRectF r(rx1, ry1, scale, scale);
41.
painter.drawRects(&r,
1
);
42.
}
43.
}
44.
}
45.
QRcode_free(qr);
46.
}
47.
else
{
48.
QColor error(
"red"
);
49.
painter.setBrush(error);
50.
painter.drawRect(
0
,
0
,width(),height());
51.
qDebug()<<
"QR FAIL: "
<< (
"errno"
);
52.
}
53.
QLabel* lb =
new
QLabel(
this
);
54.
lb->resize(
50
,
50
);
55.
lb->move((
this
->width()-
50
)/
2
,(
this
->height()-
50
)/
2
);
56.
QPixmap pe1(
"/Users/toby/Desktop/xxoo/Qt-App/WeixinPC/512.png"
);
57.
QPixmap tmp =pe1.scaled(
50
,
50
,Qt::IgnoreAspectRatio);
58.
lb->setPixmap(tmp);
59.
lb->show();
60.
// QRectF target((this->width()-50)/2,(this->height()-50)/2, 50, 50);
61.
// QRectF source(0, 0, 50, 50);
62.
// QImage img("/Users/toby/Desktop/xxoo/Qt-App/WeixinPC/128.png");
63.
// QImage tmpImg = img.scaled(50,50,Qt::IgnoreAspectRatio);
64.
// painter.drawImage(target,tmpImg,source);
65.
// painter.end();
66.
qr=
0
;
67.
}
主要还是qrencode库的加入需要注意
另外在生成二维码的同时可以加入一个logo,在paintevent中,但是加入图片后好像扫描不出,或者有些问题,希望有人知道可以指点一二
看下效果图: