自定义二维码生成器

自定义二维码生成器_第1张图片
上图是一个自定义的二维码生成工具,并可以自定义保存为设定的大小。
这个工具首先我们是依赖qrencode开源库。具体的使用和文件目录格式如下图:
自定义二维码生成器_第2张图片
在Qt工程中创建一个qrencode文件夹,包含上图所示的文件,并添加到工程目录中即可。

具体实现源码如下:

// qrwidget.h

#ifndef QRWIDGET_H
#define QRWIDGET_H

#include 
#include "qrencode/qrencode.h"

class QRWidget : public QWidget
{
    Q_OBJECT
public:
    explicit QRWidget(QWidget *parent = 0);
    ~QRWidget();
    void setString(QString str);
    int getQRWidth() const;
    bool saveImage(QString name, int size);
private:
    void draw(QPainter &painter, int width, int height);
    QString string;
    QRcode *qr;
signals:

protected:
    void paintEvent(QPaintEvent *);
    QSize sizeHint() const;
    QSize minimumSizeHint() const;
public slots:
};

#endif // QRWIDGET_H

// qrwidget.cpp

#include "qrwidget.h"
#include 
#include 
QRWidget::QRWidget(QWidget *parent) : QWidget(parent)
{
    qr = NULL;
    setString("UniMAT");
}

QRWidget::~QRWidget()
{
    if(qr != NULL)
    {
        QRcode_free(qr);
    }
}

int QRWidget::getQRWidth() const
{
    if(qr != NULL)
    {
        return qr->width;
    }
    else
    {
        return 0;
    }
}

void QRWidget::setString(QString str)
{
    string = str;
    if(qr != NULL)
    {
        QRcode_free(qr);
    }
    qr = QRcode_encodeString(string.toStdString().c_str(),
                             1,
                             QR_ECLEVEL_L,
                             QR_MODE_8,
                             1);
    update();
}
QSize QRWidget::sizeHint()  const
{
    QSize s;
    if(qr != NULL)
    {
        int qr_width = qr->width > 0 ? qr->width : 1;
        s = QSize(qr_width * 4, qr_width * 4);
    }
    else
    {
        s = QSize(50, 50);
    }
    return s;
}

QSize QRWidget::minimumSizeHint()  const
{
    QSize s;
    if(qr != NULL)
    {
        int qr_width = qr->width > 0 ? qr->width : 1;
        s = QSize(qr_width, qr_width);
    }
    else
    {
        s = QSize(50, 50);
    }
    return s;
}
bool QRWidget::saveImage(QString fileName, int size)
{
    if(size != 0 && !fileName.isEmpty())
    {
        QImage image(size, size, QImage::Format_Mono);
        QPainter painter(&image);
        QColor background(Qt::white);
        painter.setBrush(background);
        painter.setPen(Qt::NoPen);
        painter.drawRect(0, 0, size, size);
        if(qr != NULL)
        {
            draw(painter, size, size);
        }
        return image.save(fileName);
    }
    else
    {
        return false;
    }
}

void QRWidget::draw(QPainter &painter, int width, int height)
{
    QColor foreground(Qt::black);
    painter.setBrush(foreground);
    const int qr_width = qr->width > 0 ? qr->width : 1;
    double scale_x = width / qr_width;
    double scale_y = height / qr_width;
    for( int y = 0; y < qr_width; y ++)
    {
        for(int x = 0; x < qr_width; x++)
        {
            unsigned char b = qr->data[y * qr_width + x];
            if(b & 0x01)
            {
                QRectF r(x * scale_x, y * scale_y, scale_x, scale_y);
                painter.drawRects(&r, 1);
            }
        }
    }
}

void QRWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QColor background(Qt::white);
    painter.setBrush(background);
    painter.setPen(Qt::NoPen);
    painter.drawRect(0, 0, width(), height());
    if(qr != NULL)
    {
        draw(painter, width(), height());
    }
}

// qrcodetool.h

#ifndef QRCODETOOL_H
#define QRCODETOOL_H

#include 

namespace Ui {
class QRcodeTool;
}

class QRcodeTool : public QWidget
{
    Q_OBJECT

public:
    explicit QRcodeTool(QWidget *parent = 0);
    ~QRcodeTool();

private slots:
    void on_save_pushButton_clicked(bool checked);

    void on_generate_pushButton_clicked();

private:
    Ui::QRcodeTool *ui;
};

#endif // QRCODETOOL_H

// qrcodetool.cpp
#include "qrcodetool.h"
#include "ui_qrcodetool.h"

QRcodeTool::QRcodeTool(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::QRcodeTool)
{
    ui->setupUi(this);
}

QRcodeTool::~QRcodeTool()
{
    delete ui;
}

void QRcodeTool::on_save_pushButton_clicked(bool checked)
{
    Q_UNUSED(checked)
    ui->widget->saveImage(QString("C:\\Users\\Administrator\\Desktop\\build-QRcodeTool-Mingw-Debug\\%1.png").arg(ui->lineEdit->text()),
                          ui->comboBox->currentText().toInt());

}

void QRcodeTool::on_generate_pushButton_clicked()
{
    ui->widget->setString(ui->lineEdit->text());
    update();
}

#include "qrcodetool.h"
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QRcodeTool w;
    w.show();

    return a.exec();
}

你可能感兴趣的:(Qt相关技术)