2024-02-27 12:23:24 +08:00
|
|
|
#include "FluQrCodeItem.h"
|
2023-08-08 15:44:10 +08:00
|
|
|
|
2023-12-13 17:31:08 +08:00
|
|
|
#include "qrcode/qrencode.h"
|
2023-08-08 15:44:10 +08:00
|
|
|
|
2024-02-27 12:23:24 +08:00
|
|
|
FluQrCodeItem::FluQrCodeItem(QQuickItem* parent):QQuickPaintedItem(parent){
|
2023-08-08 15:44:10 +08:00
|
|
|
color(QColor(0,0,0,255));
|
2023-08-14 18:10:37 +08:00
|
|
|
bgColor(QColor(255,255,255,255));
|
2023-08-08 15:44:10 +08:00
|
|
|
size(100);
|
|
|
|
setWidth(_size);
|
|
|
|
setHeight(_size);
|
2024-02-27 12:23:24 +08:00
|
|
|
connect(this,&FluQrCodeItem::textChanged,this,[=]{update();});
|
|
|
|
connect(this,&FluQrCodeItem::colorChanged,this,[=]{update();});
|
|
|
|
connect(this,&FluQrCodeItem::bgColorChanged,this,[=]{update();});
|
|
|
|
connect(this,&FluQrCodeItem::sizeChanged,this,[=]{
|
2023-08-08 15:44:10 +08:00
|
|
|
setWidth(_size);
|
|
|
|
setHeight(_size);
|
|
|
|
update();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2024-02-27 12:23:24 +08:00
|
|
|
void FluQrCodeItem::paint(QPainter* painter){
|
2023-08-08 15:44:10 +08:00
|
|
|
if(_text.isEmpty()){
|
|
|
|
return;
|
|
|
|
}
|
2023-12-13 17:31:08 +08:00
|
|
|
if(_text.length()>1024){
|
2023-08-08 15:44:10 +08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
painter->save();
|
2023-12-13 17:31:08 +08:00
|
|
|
QRcode *qrcode = QRcode_encodeString(_text.toUtf8().constData(), 2, QR_ECLEVEL_Q, QR_MODE_8, 1);
|
|
|
|
qint32 w = width();
|
|
|
|
qint32 h = height();
|
|
|
|
qint32 qrcodeW = qrcode->width > 0 ? qrcode->width : 1;
|
|
|
|
double scaleX = (double)w / (double)qrcodeW;
|
|
|
|
double scaleY = (double)h / (double)qrcodeW;
|
|
|
|
QImage image = QImage(w, h, QImage::Format_ARGB32);
|
|
|
|
QPainter p(&image);
|
|
|
|
p.setBrush(_bgColor);
|
|
|
|
p.setPen(Qt::NoPen);
|
|
|
|
p.drawRect(0, 0, w, h);
|
|
|
|
p.setBrush(_color);
|
|
|
|
for (qint32 y = 0; y < qrcodeW; y++)
|
|
|
|
{
|
|
|
|
for (qint32 x = 0; x < qrcodeW; x++)
|
|
|
|
{
|
|
|
|
unsigned char b = qrcode->data[y*qrcodeW + x];
|
|
|
|
if (b & 0x01)
|
|
|
|
{
|
|
|
|
QRectF r(x * scaleX,y * scaleY, scaleX, scaleY);
|
|
|
|
p.drawRects(&r, 1);
|
2023-08-14 18:10:37 +08:00
|
|
|
}
|
2023-08-08 15:44:10 +08:00
|
|
|
}
|
|
|
|
}
|
2023-12-13 17:31:08 +08:00
|
|
|
QPixmap pixmap = QPixmap::fromImage(image);
|
|
|
|
painter->drawPixmap(QRect(0, 0, static_cast<int>(width()), static_cast<int>(height())), pixmap);
|
2023-08-08 15:44:10 +08:00
|
|
|
painter->restore();
|
|
|
|
}
|