FluentUI/src/FluQrCodeItem.cpp

58 lines
1.7 KiB
C++
Raw Normal View History

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