基于Qt的二维码生成器

转载自: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
cpp

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中,但是加入图片后好像扫描不出,或者有些问题,希望有人知道可以指点一二

看下效果图:


猜你喜欢

转载自blog.csdn.net/lutao614/article/details/24291949