Windows10下Qt Creator(C++)在QWidget绘制二维码及库使用问题
在Windows10 Qt Creator(C++)环境下在QWidget上绘制二维码的方案
一、使用Nayuki的QR-Code-generator库
你已经添加了头文件,接下来只需两步完成开发:
添加源文件到项目
把库的QrCode.cpp文件复制到你的Qt项目目录,在Qt Creator中右键项目 → 「添加现有文件」,选中该文件(确保QrCode.hpp已在项目头文件路径中)。生成并绘制二维码
先在代码中生成二维码数据,再通过重写QWidget的paintEvent函数绘制到界面:#include "QrCode.hpp" using namespace qrcodegen; // 生成二维码数据(可放在构造函数或按钮点击事件中) QrCode qr = QrCode::encodeText("要生成二维码的文本", QrCode::Ecc::MEDIUM); // 重写paintEvent绘制二维码 void YourWidget::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); int moduleSize = 5; // 单个二维码方块的像素大小,可根据窗口调整 // 计算居中偏移量 int offsetX = (this->width() - qr.getSize() * moduleSize) / 2; int offsetY = (this->height() - qr.getSize() * moduleSize) / 2; // 遍历每个二维码模块绘制 for (int y = 0; y < qr.getSize(); y++) { for (int x = 0; x < qr.getSize(); x++) { if (qr.getModule(x, y)) { painter.fillRect(offsetX + x*moduleSize, offsetY + y*moduleSize, moduleSize, moduleSize, Qt::black); } else { painter.fillRect(offsetX + x*moduleSize, offsetY + y*moduleSize, moduleSize, moduleSize, Qt::white); } } } }纠错级别可选择
LOW/MEDIUM/QUARTILE/HIGH,按需调整。
二、使用qrencode库(Windows环境配置)
1. 编译与配置库
- 若使用MSYS2,直接在终端执行命令安装编译好的库:
pacman -S mingw-w64-x86_64-qrencode。 - 手动编译:下载源码后用CMake生成VS工程,编译得到静态库
libqrencode.a或动态库qrencode.dll。 - 在Qt项目的
.pro文件中添加库依赖:LIBS += -L$$PWD/ -lqrencode # 库文件所在路径 INCLUDEPATH += $$PWD/include # 头文件所在路径
2. 生成并绘制二维码
#include <qrencode.h> // 生成二维码数据(示例:自动选择版本,中等纠错级别) QRcode *qrcode = QRcode_encodeString("要生成二维码的文本", 0, QR_ECLEVEL_M, QR_MODE_8, 1); if (!qrcode) return; // 重写paintEvent绘制 void YourWidget::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); int moduleSize = 5; int offsetX = (this->width() - qrcode->width * moduleSize) / 2; int offsetY = (this->height() - qrcode->width * moduleSize) / 2; uchar *data = qrcode->data; for (int y = 0; y < qrcode->width; y++) { for (int x = 0; x < qrcode->width; x++) { if (*data & 0x01) { painter.fillRect(offsetX + x*moduleSize, offsetY + y*moduleSize, moduleSize, moduleSize, Qt::black); } else { painter.fillRect(offsetX + x*moduleSize, offsetY + y*moduleSize, moduleSize, moduleSize, Qt::white); } data++; } } // 释放内存,避免泄漏 QRcode_free(qrcode); }
内容的提问来源于stack exchange,提问作者Bouguerra Oussama
相关产品推荐
相关产品推荐

