sacar personalizados para hacer gratis generador funciona empresa crear como codigos codigo c++ qt render qr-code

c++ - para - generador de codigos qr personalizados



Cómo dibujar un código QR con Qt en C/C++ nativo (2)

Si crees que la biblioteca de Fukuchi es demasiado grande [0] para ti, considera consultar la biblioteca del generador de códigos QR en C ++ de Nayuki [1] : https://github.com/nayuki/QR-Code-generator/tree/master/cpp

La biblioteca de Nayuki requiere C ++ 11, y es portátil sin necesidad de Autotools. Uso de muestra:

#include <string> #include <vector> #include "QrCode.hpp" using namespace qrcodegen; // Create the QR Code object QrCode qr = QrCode::encodeText("Hello, world!", QrCode::Ecc::MEDIUM); // Read the black & white pixels for (int y = 0; y < qr.size; y++) { for (int x = 0; x < qr.size; x++) { int color = qr.getModule(x, y); // 0 for white, 1 for black // You need to modify this part draw_pixel_onto_QT(x, y, color); } }

[0]: Fukuchi: 20 archivos, ~ 7200 líneas entre los principales archivos .c y .h (sin incluir el código de compilación y prueba).
[1]: Nayuki: 6 archivos, ~ 1400 líneas entre los principales archivos .cpp y .hpp (sin incluir el código de demostración).

EDITAR 2016-12-08 por OP Decidí, con permiso, agregar mi propia adaptación a Qt. Este código compila y funciona bien en mi sistema, y ​​creo que debería ser lo suficientemente independiente como para funcionar en otro lugar sin demasiados ajustes.

#include "QrCode.hpp" void paintQR(QPainter &painter, const QSize sz, const QString &data, QColor fg) { // NOTE: At this point you will use the API to get the encoding and format you want, instead of my hardcoded stuff: qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(data.toUtf8().constData(), qrcodegen::QrCode::Ecc::LOW); const int s=qr.getSize()>0?qr.getSize():1; const double w=sz.width(); const double h=sz.height(); const double aspect=w/h; const double size=((aspect>1.0)?h:w); const double scale=size/(s+2); // NOTE: For performance reasons my implementation only draws the foreground parts in supplied color. // It expects background to be prepared already (in white or whatever is preferred). painter.setPen(Qt::NoPen); painter.setBrush(fg); for(int y=0; y<s; y++) { for(int x=0; x<s; x++) { const int color=qr.getModule(x, y); // 0 for white, 1 for black if(0!=color) { const double rx1=(x+1)*scale, ry1=(y+1)*scale; QRectF r(rx1, ry1, scale, scale); painter.drawRects(&r,1); } } } }

Para el uso, vea esta clase de painter .

QR en Qt

Como una pregunta complementaria sobre Cómo escanear códigos QR con Qt , quiero saber cómo dibujar un código QR a partir del código nativo C / C ++ en mi aplicación de escritorio basada en Qt5, pero no pude encontrar un ejemplo de cómo hacerlo.

Sé que QtQR existe, pero tiene dependencias con python-qrtools que, en mi opinión, derrota el propósito de usar Qt en primer lugar. Quiero una solución ágil, eficiente y libre de dependencia que compile con mi aplicación donde sea que decida llevarla.

¿Cómo puedo hacer eso?


ACTUALIZACIÓN 3 / 3-2016: Me llamó la atención que hay un pequeño proyecto de biblioteca que hace lo que hace mi respuesta, pero de una manera más "preempaquetada". Puedes consultarlo here .

QR en Qt

Hay una pequeña biblioteca de generador de código QR en C puro y sin dependencias, llamada libqrencode .

Paso 1: Instalar

Antes de que pueda usarlo, tendrá que instalarlo. En mi Ubuntu 13.10 eso significaba escribir lo siguiente en un shell:

sudo aptitude install libqrencode-dev

En otras plataformas, puede que tengas que compilarlo tú mismo desde la fuente. Simplemente descarga el tarball y sigue las instrucciones de la libqrencode .

Paso 2: archivo de proyecto

A continuación, tendrá que agregar la biblioteca a su proyecto. En mi archivo de proyecto Qt5.2.0 (myproject.pro o similar) eso significaba agregar la siguiente línea:

LIBS += -lqrencode

Esto debería ser similar para la mayoría de las versiones de Qt que conozco.

Paso 3: codificar

A continuación, debe escribir el código que realmente usa la biblioteca para codificar una cadena de entrada al formato QR. Esa es una línea de código:

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

NOTA: Después de experimentar con los parámetros que he pasado a esta función, he aprendido que hay que tener cuidado. Algunas combinaciones de parámetros fallaron sin una buena razón. Por ejemplo, pasar 0 como versión o usar QR_MODE_AN falló con "Parámetros no válidos". Esto podría ser errores en la versión antigua de la biblioteca que estoy usando. Usted ha sido advertido.

Paso 4: renderizar imagen

Finalmente, antes de limpiar, necesita convertir la salida a mapa de bits para que se pueda representar en la pantalla. Esto es más simple de lo que parece. En lugar de enumerar un montón de suposiciones, en lugar de eso incluiré aquí mi implementación completa de QRWidget minimalista de trabajo. Los bits interesantes están en el método paintEvent () anulado.

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; }

Resumen En esta pequeña publicación resumí mi experiencia con la obtención de un generador de códigos QR que funciona con Qt.