You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows10下Qt Creator(C++)在QWidget绘制二维码及库使用问题

在Windows10 Qt Creator(C++)环境下在QWidget上绘制二维码的方案

一、使用Nayuki的QR-Code-generator库

你已经添加了头文件,接下来只需两步完成开发:

  1. 添加源文件到项目
    把库的QrCode.cpp文件复制到你的Qt项目目录,在Qt Creator中右键项目 → 「添加现有文件」,选中该文件(确保QrCode.hpp已在项目头文件路径中)。

  2. 生成并绘制二维码
    先在代码中生成二维码数据,再通过重写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 17:52:39