From a3eaedde549901e296c414ea09827ae29d8ffb65 Mon Sep 17 00:00:00 2001 From: gregory Date: Thu, 8 May 2025 15:51:45 -0400 Subject: [PATCH 1/4] rewrite QImage QrCodeGenerator::qrCodeToImage to solve warning and qr fails when qt.svg: Invalid path data; path truncated. for long string content --- src/QrCodeGenerator.cpp | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/QrCodeGenerator.cpp b/src/QrCodeGenerator.cpp index b6ffb8a..e6101ec 100644 --- a/src/QrCodeGenerator.cpp +++ b/src/QrCodeGenerator.cpp @@ -113,15 +113,45 @@ QString QrCodeGenerator::toSvgString(const qrcodegen::QrCode &qr, * @param size The image size to generate. * @return QImage representing the QR code. */ +// QImage QrCodeGenerator::qrCodeToImage(const qrcodegen::QrCode &qrCode, +// quint16 border, quint16 size) const +// { +// QString svg = toSvgString(qrCode, border); +// QSvgRenderer render(svg.toUtf8()); +// QImage image(size, size, QImage::Format_Mono); +// image.fill(Qt::white); +// QPainter painter(&image); +// painter.setRenderHint(QPainter::Antialiasing); +// render.render(&painter); +// return image; +// } + +// modified version that solve large string issue. +// W : qt.svg: Invalid path data; path truncated. QImage QrCodeGenerator::qrCodeToImage(const qrcodegen::QrCode &qrCode, quint16 border, quint16 size) const { - QString svg = toSvgString(qrCode, border); - QSvgRenderer render(svg.toUtf8()); - QImage image(size, size, QImage::Format_Mono); + const int qrSize = qrCode.getSize(); + const int scale = size / (qrSize + 2 * border); + + QImage image(size, size, QImage::Format_RGB32); image.fill(Qt::white); + QPainter painter(&image); - painter.setRenderHint(QPainter::Antialiasing); - render.render(&painter); + painter.setBrush(Qt::black); + painter.setPen(Qt::NoPen); + + for (int y = 0; y < qrSize; ++y) + { + for (int x = 0; x < qrSize; ++x) + { + if (qrCode.getModule(x, y)) + { + QRect rect((x + border) * scale, (y + border) * scale, scale, scale); + painter.drawRect(rect); + } + } + } + return image; } From 813bc1d97f7dd21d15ca89f6e8eec5f5cbe57df5 Mon Sep 17 00:00:00 2001 From: gregory Date: Thu, 8 May 2025 15:56:28 -0400 Subject: [PATCH 2/4] add more issue description --- src/QrCodeGenerator.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/QrCodeGenerator.cpp b/src/QrCodeGenerator.cpp index e6101ec..49a55a1 100644 --- a/src/QrCodeGenerator.cpp +++ b/src/QrCodeGenerator.cpp @@ -126,8 +126,11 @@ QString QrCodeGenerator::toSvgString(const qrcodegen::QrCode &qr, // return image; // } -// modified version that solve large string issue. -// W : qt.svg: Invalid path data; path truncated. +// QR code image is being rendered from SVG output, not directly from bitmaps or +// matrices +// If the generated SVG string is too large or malformed, the QSvgRenderer will +// throw warnings. +// like: W : qt.svg: Invalid path data; path truncated. QImage QrCodeGenerator::qrCodeToImage(const qrcodegen::QrCode &qrCode, quint16 border, quint16 size) const { From 8be10721eeaedcb76675686c72f7f27ee59c15f1 Mon Sep 17 00:00:00 2001 From: gregory Date: Thu, 8 May 2025 15:58:19 -0400 Subject: [PATCH 3/4] =?UTF-8?q?QSvgRenderer=20has=20internal=20limits=20on?= =?UTF-8?q?=20path=20complexity=20or=20buffer=20size=20=E2=80=94=20hitting?= =?UTF-8?q?=20those=20leads=20to=20the=20truncation=20warning.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/QrCodeGenerator.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/QrCodeGenerator.cpp b/src/QrCodeGenerator.cpp index 49a55a1..c934d31 100644 --- a/src/QrCodeGenerator.cpp +++ b/src/QrCodeGenerator.cpp @@ -126,8 +126,10 @@ QString QrCodeGenerator::toSvgString(const qrcodegen::QrCode &qr, // return image; // } -// QR code image is being rendered from SVG output, not directly from bitmaps or -// matrices + +// QR code image is being rendered from SVG output, not directly from bitmaps or matrices +// QSvgRenderer has internal limits on path complexity or buffer size — hitting +// those leads to the truncation warning. // If the generated SVG string is too large or malformed, the QSvgRenderer will // throw warnings. // like: W : qt.svg: Invalid path data; path truncated. From 594033264ea0f6e5c29b6d6852091a76845b0b7a Mon Sep 17 00:00:00 2001 From: gregory Date: Thu, 8 May 2025 20:04:01 -0400 Subject: [PATCH 4/4] =?UTF-8?q?dynamically=20adjusts=20the=20imageSize=20s?= =?UTF-8?q?o=20that=20each=20module=20is=20an=20integer=20number=20of=20pi?= =?UTF-8?q?xels,=20avoiding=20possible=20aliasing=20artifacts=20when=20siz?= =?UTF-8?q?e=20isn=E2=80=99t=20divisible=20evenly=20by=20qrSize=20+=202=20?= =?UTF-8?q?=C3=97=20border.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/QrCodeGenerator.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/QrCodeGenerator.cpp b/src/QrCodeGenerator.cpp index c934d31..cd70613 100644 --- a/src/QrCodeGenerator.cpp +++ b/src/QrCodeGenerator.cpp @@ -126,10 +126,9 @@ QString QrCodeGenerator::toSvgString(const qrcodegen::QrCode &qr, // return image; // } - -// QR code image is being rendered from SVG output, not directly from bitmaps or matrices -// QSvgRenderer has internal limits on path complexity or buffer size — hitting -// those leads to the truncation warning. +// QR code image is being rendered from SVG output, not directly from bitmaps or +// matrices QSvgRenderer has internal limits on path complexity or buffer size — +// hitting those leads to the truncation warning. // If the generated SVG string is too large or malformed, the QSvgRenderer will // throw warnings. // like: W : qt.svg: Invalid path data; path truncated. @@ -137,23 +136,28 @@ QImage QrCodeGenerator::qrCodeToImage(const qrcodegen::QrCode &qrCode, quint16 border, quint16 size) const { const int qrSize = qrCode.getSize(); - const int scale = size / (qrSize + 2 * border); - - QImage image(size, size, QImage::Format_RGB32); + const int totalSize = qrSize + 2 * border; + // Calculate scaling factor to fit requested size + const int pixelSize = size / totalSize; + const int imageSize = pixelSize * totalSize; + // Create the output image + QImage image(imageSize, imageSize, QImage::Format_RGB32); image.fill(Qt::white); QPainter painter(&image); painter.setBrush(Qt::black); painter.setPen(Qt::NoPen); + // Draw each QR module (black square) for (int y = 0; y < qrSize; ++y) { for (int x = 0; x < qrSize; ++x) { if (qrCode.getModule(x, y)) { - QRect rect((x + border) * scale, (y + border) * scale, scale, scale); - painter.drawRect(rect); + int xPos = (x + border) * pixelSize; + int yPos = (y + border) * pixelSize; + painter.drawRect(xPos, yPos, pixelSize, pixelSize); } } }