FluentUI/src/FluQrCodeItem.cpp
朱子楚\zhuzi 6749e47c22 update
2024-02-27 12:23:24 +08:00

58 lines
1.7 KiB
C++

#include "FluQrCodeItem.h"
#include "qrcode/qrencode.h"
FluQrCodeItem::FluQrCodeItem(QQuickItem* parent):QQuickPaintedItem(parent){
color(QColor(0,0,0,255));
bgColor(QColor(255,255,255,255));
size(100);
setWidth(_size);
setHeight(_size);
connect(this,&FluQrCodeItem::textChanged,this,[=]{update();});
connect(this,&FluQrCodeItem::colorChanged,this,[=]{update();});
connect(this,&FluQrCodeItem::bgColorChanged,this,[=]{update();});
connect(this,&FluQrCodeItem::sizeChanged,this,[=]{
setWidth(_size);
setHeight(_size);
update();
});
}
void FluQrCodeItem::paint(QPainter* painter){
if(_text.isEmpty()){
return;
}
if(_text.length()>1024){
return;
}
painter->save();
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);
}
}
}
QPixmap pixmap = QPixmap::fromImage(image);
painter->drawPixmap(QRect(0, 0, static_cast<int>(width()), static_cast<int>(height())), pixmap);
painter->restore();
}