基于Qt的二维码生成器

      基于目前项目中可能需要用到二维码生成和读取,再此研究了一下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;
}

     主要还是qrencode库的加入需要注意

     另外在生成二维码的同时可以加入一个logo,在paintevent中,但是加入图片后好像扫描不出,或者有些问题,希望有人知道可以指点一二

     看下效果图:

基于Qt的二维码生成器_第1张图片    

问题找到了是编码的时候需要设置一下容错等级,开始写的是容错等级最低,这样加入图片的话,再软件扫描的时候,扫不出来的,将等级调到中等即可

QR_ECLEVEL_Q

呵呵 共享

基于Qt的二维码生成器_第2张图片

       

你可能感兴趣的:(C++,mac,qt,二维码,QR码)