Qt中使用Zint库显示二维码

Qt中使用Zint库显示二维码

先使用的是QtCreator 创建项目,但是会报错。

于是改用VS2022创建Qt项目,然后然后添加相关的库,就能调用Zint库中的函数生成二维码了。

第一步加载Zint库:

先把Zint源码中的include文件夹、lib文件夹、复制到项目目录下、Zint.dll、libpng16.dll放到运行目录下,如下图:

第二步:项目属性中添加Zint相关文件,如下图:

第三步:项目源代码

c++ 复制代码
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QZintLibTest.h"

class QZintLibTest : public QMainWindow
{
    Q_OBJECT

public:
    QZintLibTest(QWidget *parent = nullptr);
    ~QZintLibTest();

    void on_pushButton_Clicked();

private:
    Ui::QZintLibTestClass ui;
};
C++ 复制代码
#include "QZintLibTest.h"
#include<QObject>
#include<QMessageBox>
#include"include/zint.h"

QZintLibTest::QZintLibTest(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    QObject::connect(ui.pushButton, &QPushButton::clicked, this, &QZintLibTest::on_pushButton_Clicked);
}

QZintLibTest::~QZintLibTest()
{
}
void QZintLibTest::on_pushButton_Clicked()
{
    QString strText = ui.lineEdit->text();
    if (strText.isEmpty())
    {
        QMessageBox::warning(this, "提示", "输入内容不能为空!");
        return;
    }

    struct zint_symbol* symbol = ZBarcode_Create();
    if (symbol == nullptr)
    {
        QMessageBox::critical(this, "错误", "创建Zint条码对象失败!");
        return;
    }

    // 1. 配置Zint二维码参数(保留你的原有配置)
    symbol->scale = 2;          // 缩放比例
    symbol->option_1 = 3;       // QR码版本等参数
    symbol->option_2 = 5;
    symbol->symbology = BARCODE_QRCODE;  // 二维码类型
    symbol->output_options = 0;
    symbol->show_hrt = 0;       // 不显示下方文字
    symbol->input_mode = DATA_MODE;

    // 2. 安全设置输出图片名(统一大小写,无缓冲区溢出)
    strcpy_s(symbol->outfile,256, "QR.bmp");  // 推荐写法
    // 若需指定绝对路径(可选,生成到程序运行目录)
    // QString imgPath = QCoreApplication::applicationDirPath() + "/QR.bmp";
    // strcpy(symbol->outfile, imgPath.toLocal8Bit().constData());

    // 3. 转换输入内容为Zint支持的UTF-8格式
    QByteArray ba = strText.toUtf8();
    const char* pText = ba.constData();
    int nRet = ZBarcode_Encode(symbol, (const unsigned char*)pText, strlen(pText));

    if (nRet != 0)
    {
        QString strErr(symbol->errtxt);
        QMessageBox::critical(this, "编码错误", strErr);
        ZBarcode_Delete(symbol);
        return;
    }

    // 4. 核心修复:调用ZBarcode_Print生成图片文件(必须执行!)
    nRet = ZBarcode_Print(symbol, 0);  // 0=不旋转图片
    if (nRet != 0)
    {
        
        ZBarcode_Delete(symbol);
        return;
    }

    // 5. 加载图片并校验有效性(统一文件名,增加isNull判断)
    QPixmap pixTMP("QR.bmp");
    if (pixTMP.isNull())
    {
     
        ZBarcode_Delete(symbol);
        return;
    }

    // 6. 缩放图片并显示到QLabel(保持宽高比,避免变形)
    QPixmap pix = pixTMP.scaled(ui.label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
    ui.label->setPixmap(pix);
    // 可选:设置QLabel对齐方式,让二维码居中显示
    ui.label->setAlignment(Qt::AlignCenter);

    // 7. 释放Zint资源,避免内存泄漏
    ZBarcode_Delete(symbol);
}

项目运行效果:

好了,项目就介绍到这里了。

相关推荐
(Charon)7 小时前
【C++/Qt】Qt 封装 TCP 客户端底层 Network 类:连接、收发、自动测试与错误处理
服务器·网络·qt·tcp/ip
小短腿的代码世界10 小时前
QCefView深度解析:Qt应用中嵌入Chromium浏览器的终极方案
开发语言·qt
小短腿的代码世界14 小时前
VLC-Qt深度解析:Qt应用中的专业视频播放方案
开发语言·qt
rrr214 小时前
【前端开发】|GUI 基本概念和框架基础
前端·qt
Z文的博客14 小时前
【避坑实录】Qt 4.8.6 + Paho MQTT C客户端 + OpenSSL静态链接的血泪史
c语言·开发语言·qt·嵌入式linux
(Charon)14 小时前
【C++/Qt】Qt 实现 TCP Client:从功能构思到消息收发与日志保存
qt·网络协议·tcp/ip
qq_2837200514 小时前
Qt5.12.8 QML Canvas ctx.setLineDash 失效终极解决方案
开发语言·qt
Z文的博客15 小时前
嵌入式LINUX QT 开发 .gitignore 文件编写指南
linux·git·qt·elasticsearch·嵌入式
掘根15 小时前
【微服务即时通讯】客户端数据中心
qt·微服务·架构
西门吹牛15 小时前
Pycharm编译器中部署了pyqt5,Qtdesigner无法打开了,解决方案
ide·qt·pycharm