Lennart Rolland Lennart Rolland - 1 year ago 253
C++ Question

How to draw a QR code with Qt in native C/C++

QR in Qt

I want to draw a QR code from native C/C++ code in my Qt5 based desktop app, but I could not find an example of how to do this.

I know QtQR exists, but it has dependencies on python-qrtools which in my opinion kind of defeats the purpose of using Qt in the first place. I want a nimble, efficient and dependency-free solution that will compile with my app wherever I decided to take it.

How can I do that?

Answer Source

UPDATE 3/3-2016: It has come to my attention that there is a small library project that does what my answer does but in a more "prepackaged" way. You can check it out here.

QR in Qt

There is a small QR-code generator library in pure C and without dependencies, called libqrencode.

Step 1: Install

Before you can use it, you will have to install it. On my Ubuntu 13.10 that meant typing the following in a shell:

sudo aptitude install libqrencode-dev

On other platforms you may have to build it from source by yourself. Simply download the tarball and follow the instructions from the source code download.

Step 2: Project file

Next, you will have to add the library to your project. In my Qt5.2.0 project file (myproject.pro or similar) that meant appending the following line:

LIBS += -lqrencode

This should be similar for most versions of Qt that I know.

Step 3: encode

Next one must write the code that actually uses the library to encode some input string to QR format. That is one line of code:

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

NOTE: After experimenting with the parameters I have passed to this function, I have learned that one needs to be careful. Some combinations of parameters failed for no good reason. For example passing 0 as version or using QR_MODE_AN failed with "Invalid parameters". This might be bugs in the ancient version of the library that I am using You have been warned.

Step 4: render image

Finally, before cleaning up, you need to convert the output to bitmap so that it can be rendered on the screen. This is simpler than it sounds. Instead of listing a bunch of assumptions I will instead included my complete working minimalistic QRWidget implementation here. The interesting bits are in the overridden paintEvent() method.



#include <QWidget>

class QRWidget : public QWidget{
    QString data;
    explicit QRWidget(QWidget *parent = 0);
    void setQRData(QString data);

    void paintEvent(QPaintEvent *);

#endif // QRWIDGET_HPP


#include "QRWidget.hpp"
#include <QPainter>
#include <QDebug>    
#include <qrencode.h>

QRWidget::QRWidget(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){

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);
        QColor fg("black");
        QColor bg("white");
        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);
        QColor error("red");
        qDebug()<<"QR FAIL: "<< strerror(errno);

Summary In this little post I have summarized my experience with getting a QR code generator working with Qt.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download