c++ - 在本机 C/C++ 中,如何绘制带有Qt的QR码

  显示原文与译文双语对照的内容
0 0

QR在Qt

我想画一个 QR代码从本机C/C++代码在我的Qt5基于桌面app,但我找不到如何执行此操作的示例。

我知道 QtQR上存在,但它依赖python qrtools 这在我看来有点就背离了使用Qt的放在首位。 我需要一个灵活的,高效而且依赖免费的解决方案可对其进行编译,把app只要我决定接受它。

啊,我该怎么做?

时间:原作者:1个回答

0 0

QR中Qt

这里有一个小小的二维码生成器库在纯C 和不存在相关性,简称 libqrencode

Step 1: 安装

你可以使用它之前,你必须安装它。 在我Ubuntu 13 .10签订的shell中键入以下命令:

sudo aptitude install libqrencode-dev

在其他平台上可能需要一个人从源代码构建它。 只需下载tarball并按照说明从源代码下载

Step 2: 项目文件

接下来,你需要将库添加到项目中。 在我的Qt5 .2 .0项目文件( myproject pro或类似) 意味着应追加以下行:

LIBS += -lqrencode

这应该是类似于大多数版本的Qt,我知道

Step 3: 编码

下一个必须编写的代码实际上使用的库编码一些输入字符串为QR格式。 这是一行代码:

QRcode *qr=QRcode_encodeString("my string", 1, QR_ECLEVEL_L, QR_MODE_8,0);

Note : 试验后我已经传递给此函数的参数,我懂得了一个需要小心。 某些组合的参数失败,没有好的理由。 例如传递0 作为版本或使用QR_MODE_AN失败,出现" 参数无效" 。 这可能是bug的古老版本的库中我使用事先警告你

Step 4: 渲染图像

最后,清理之前,你需要将输出转换成位图,以便将其呈现在屏幕上。 这是是比听起来。 而不是列出一堆假设我将代替包含完整的运行简单性QRWidget实现这里。 一些有趣的功能。passivecount paintEvent( ) 方法重写。

QRWidget .hpp

#ifndef QRWIDGET_HPP
#define QRWIDGET_HPP
#include <QWidget>
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

QRWidget cpp

#include "QRWidget.hpp"
#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: "<< strerror(errno);
    }
    qr=0;
}

Summary 在一个小岗位我就总结我的成长得到一个二维码生成器使用Qt 。

原作者:
...