mirror of https://github.com/qTox/qTox.git
8 changed files with 243 additions and 21 deletions
@ -0,0 +1,103 @@ |
|||||||
|
#include "qrwidget.h" |
||||||
|
#include <QPainter> |
||||||
|
#include <QDebug> |
||||||
|
#include <QBuffer> |
||||||
|
#include <QImage> |
||||||
|
#include "qrencode.h" |
||||||
|
|
||||||
|
QRWidget::QRWidget(QWidget *parent) : QWidget(parent), data("0") |
||||||
|
//Note: The encoding fails with empty string so I just default to something else.
|
||||||
|
//Use the setQRData() call to change this.
|
||||||
|
{ |
||||||
|
//size of the qimage might be problematic in the future, but it works for me
|
||||||
|
size.setWidth(480); |
||||||
|
size.setHeight(480); |
||||||
|
image = new QImage(size, QImage::Format_RGB32); |
||||||
|
} |
||||||
|
|
||||||
|
void QRWidget::setQRData(QString data) |
||||||
|
{ |
||||||
|
this->data = "tox:" + data; |
||||||
|
paintImage(); |
||||||
|
} |
||||||
|
|
||||||
|
QImage* QRWidget::getImage() |
||||||
|
{ |
||||||
|
return image; |
||||||
|
} |
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief QRWidget::saveImage |
||||||
|
* @param path Full path to the file with extension. |
||||||
|
* @return indicate if saving was successful. |
||||||
|
*/ |
||||||
|
bool QRWidget::saveImage(QString path) |
||||||
|
{ |
||||||
|
return image->save(path, 0, 75); //0 - image format same as file extension, 75-quality, png file is ~6.3kb
|
||||||
|
} |
||||||
|
|
||||||
|
QString QRWidget::getImageAsText() |
||||||
|
{ |
||||||
|
paintImage(); |
||||||
|
QByteArray ba; |
||||||
|
QBuffer buffer(&ba); |
||||||
|
buffer.open(QIODevice::WriteOnly); |
||||||
|
image->save(&buffer, "PNG"); // writes the image in PNG format inside the buffer
|
||||||
|
|
||||||
|
QString iconBase64 = QString::fromLatin1(ba.toBase64().data()); |
||||||
|
QString base64Image = "<img width=\"300\" heigth=\"300\" src=\"data:image/png;base64," + iconBase64 +"\" />"; |
||||||
|
|
||||||
|
return QString(base64Image); |
||||||
|
} |
||||||
|
|
||||||
|
//http://stackoverflow.com/questions/21400254/how-to-draw-a-qr-code-with-qt-in-native-c-c
|
||||||
|
void QRWidget::paintImage() |
||||||
|
{ |
||||||
|
QPainter painter(image); |
||||||
|
//NOTE: I have hardcoded some parameters here that would make more sense as variables.
|
||||||
|
// ECLEVEL_M is much faster recognizable by barcodescanner any any other type
|
||||||
|
QRcode *qr = QRcode_encodeString(data.toStdString().c_str(), 1, QR_ECLEVEL_M, QR_MODE_8, 0); |
||||||
|
|
||||||
|
if(0 != qr) |
||||||
|
{ |
||||||
|
QColor fg("black"); |
||||||
|
QColor bg("white"); |
||||||
|
painter.setBrush(bg); |
||||||
|
painter.setPen(Qt::NoPen); |
||||||
|
painter.drawRect(0, 0, size.width(), size.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); |
||||||
|
painter.save(); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
QColor error("red"); |
||||||
|
painter.setBrush(error); |
||||||
|
painter.drawRect(0, 0, width(), height()); |
||||||
|
qDebug() << "QR FAIL: " << strerror(errno); |
||||||
|
} |
||||||
|
|
||||||
|
qr = 0; |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
#ifndef QRWIDGET_H |
||||||
|
#define QRWIDGET_H |
||||||
|
|
||||||
|
// https://stackoverflow.com/questions/21400254/how-to-draw-a-qr-code-with-qt-in-native-c-c
|
||||||
|
|
||||||
|
#include <QWidget> |
||||||
|
|
||||||
|
class QRWidget : public QWidget |
||||||
|
{ |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
public: |
||||||
|
explicit QRWidget(QWidget *parent = 0); |
||||||
|
void setQRData(QString data); |
||||||
|
QString getImageAsText(); |
||||||
|
QImage* getImage(); |
||||||
|
bool saveImage(QString path); |
||||||
|
|
||||||
|
private: |
||||||
|
QString data; |
||||||
|
void paintImage(); |
||||||
|
QImage *image; |
||||||
|
QSize size; |
||||||
|
}; |
||||||
|
|
||||||
|
#endif // QRWIDGET_H
|
Loading…
Reference in new issue