mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
qrcode support by html tooltip
This commit is contained in:
parent
bd12381bea
commit
4b1c5e80e9
87
src/misc/qrwidget.cpp
Normal file
87
src/misc/qrwidget.cpp
Normal file
|
@ -0,0 +1,87 @@
|
|||
#include "qrwidget.h"
|
||||
#include <QPainter>
|
||||
#include <QDebug>
|
||||
#include <QBuffer>
|
||||
#include <QImage>
|
||||
#include "qrcodewindow.h"
|
||||
#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 = data;
|
||||
paintImage();
|
||||
}
|
||||
|
||||
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=\"350\" heigth=\"350\" 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.
|
||||
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, 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;
|
||||
}
|
24
src/misc/qrwidget.h
Normal file
24
src/misc/qrwidget.h
Normal file
|
@ -0,0 +1,24 @@
|
|||
#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();
|
||||
|
||||
private:
|
||||
QString data;
|
||||
void paintImage();
|
||||
QImage *image;
|
||||
QSize size;
|
||||
};
|
||||
|
||||
#endif // QRWIDGET_H
|
|
@ -30,6 +30,8 @@
|
|||
#include <QClipboard>
|
||||
#include <QInputDialog>
|
||||
#include <QFileDialog>
|
||||
#include "src/misc/qrwidget.h"
|
||||
#include "qrencode.h"
|
||||
|
||||
IdentityForm::IdentityForm() :
|
||||
GenericForm(tr("Identity"), QPixmap(":/img/settings/identity.png"))
|
||||
|
@ -126,6 +128,11 @@ void IdentityForm::setToxId(const QString& id)
|
|||
{
|
||||
toxId->setText(id);
|
||||
toxId->setCursorPosition(0);
|
||||
|
||||
QRWidget *qrcode = new QRWidget();
|
||||
qrcode->setQRData(id);
|
||||
|
||||
toxId->setToolTip(qrcode->getImageAsText());
|
||||
}
|
||||
|
||||
void IdentityForm::onLoadClicked()
|
||||
|
|
Loading…
Reference in New Issue
Block a user