Qt实现自定义字符串生成二维码(附完整源码+详细解析)
Qt实现自定义字符串生成二维码附完整源码详细解析一、前言在日常开发中二维码生成是一个非常常见的需求。本文将基于Qt框架结合qrencode开源库实现一个输入自定义字符串生成二维码并显示、保存的桌面程序。程序支持初始化生成固定字符串二维码也支持通过输入框自定义字符串点击按钮生成新的二维码同时将二维码保存为本地图片文件。下载链接https://download.csdn.net/download/xiaoxiao133/92689759开发环境说明Qt版本Qt 5.15.2兼容Qt 5.x/6.x编译器MinGW 8.1.0Windows/ GCCLinux依赖库qrencode二维码编码核心库开发系统Windows 10本文以Windows为例Linux适配见下文二、环境准备安装qrencode库1. Windows环境MinGW方式1手动编译下载qrencode源码https://fukuchi.org/works/qrencode/用CMakeMinGW编译生成静态库libqrencode.a或动态库qrencode.dlllibqrencode.dll.a方式2直接下载预编译库推荐使用第三方打包的MinGW版本qrencode库解压后将include目录下的头文件复制到Qt的MinGW/include目录lib目录下的库文件复制到Qt的MinGW/lib目录。2. Linux环境Ubuntu/Debian直接通过命令安装sudoapt-getinstalllibqrencode-dev3. Qt项目配置.pro文件新建Qt Widgets项目后在.pro文件中添加qrencode库的链接配置核心QT core gui widgets CONFIG c11 # 链接qrencode库Windows/Linux通用确保库路径正确 LIBS -lqrencode # 生成可执行文件名称 TARGET QRCodeGenerator TEMPLATE app # 源文件列表 SOURCES main.cpp \ mainwindow.cpp \ qgetqr.cpp # 头文件列表 HEADERS mainwindow.h \ qgetqr.h # UI文件如果有 FORMS mainwindow.ui三、项目整体结构解析整个项目包含5个核心文件职责分工清晰文件名称作用说明main.cpp程序入口创建QApplication和MainWindow实例启动程序mainwindow.h/cpp主窗口界面逻辑负责初始化显示二维码、处理按钮点击事件、读取输入框内容qgetqr.h/cpp二维码生成核心类封装qrencode库调用实现二维码生成、保存功能mainwindow.ui主窗口UI布局包含标签Label、输入框LineEdit、按钮PushButton四、核心代码逐行解析1. 二维码核心类QGetQRqgetqr.h qgetqr.cpp该类是整个程序的核心封装了二维码生成和保存的逻辑解耦界面与业务逻辑。1头文件qgetqr.h#ifndefQGETQR_H#defineQGETQR_H/* * This class is used to get QR image * 封装二维码生成、保存功能的核心类 */#includeQImage#includeQString#includeQPainter// 引入qrencode库头文件必须确保库已安装且路径正确#includeqrencode.hclassQGetQR{public:QGetQR();// 构造函数// 生成二维码图片核心方法// 参数data-二维码内容字符串size-生成图片尺寸默认200pxQImagegenerateQRCode(constQStringdata,intsize200);// 保存二维码到本地文件// 参数data-二维码内容filePath-保存路径size-图片尺寸默认200pxboolsaveQRCode(constQStringdata,constQStringfilePath,intsize200);};#endif// QGETQR_H2实现文件qgetqr.cpp#includeqgetqr.h// 构造函数暂无初始化逻辑QGetQR::QGetQR(){// 空实现可扩展初始化参数如默认纠错等级、尺寸等}// 核心方法生成二维码QImage对象QImageQGetQR::generateQRCode(constQStringdata,intsize){// 1. 初始化二维码图片ARGB32格式指定尺寸背景填充白色QImageqrImage(size,size,QImage::Format_ARGB32);qrImage.fill(Qt::white);// 2. 调用qrencode库生成二维码数据结构/* * QRcode_encodeString参数说明 * - data.toUtf8().constData()待编码的字符串转UTF8兼容中文 * - 5二维码版本1-40版本越高可存储内容越多 * - QR_ECLEVEL_M纠错等级L/M/Q/HM为中等纠错 * - QR_MODE_8编码模式8位字节模式支持任意字符 * - 1是否强制UTF8编码1是 */QRcode*qrcodeQRcode_encodeString(data.toUtf8().constData(),5,QR_ECLEVEL_M,QR_MODE_8,1);if(!qrcode){// 生成失败返回空白白色图片returnqrImage;}// 3. 计算缩放比例确保二维码铺满指定size的图片intqrSizeqrcode-width;// 二维码原始尺寸二维码矩阵的边长intscalesize/qrSize;// 缩放比例每个二维码像素点对应图片的像素数if(scale1)scale1;// 防止缩放比例过小// 4. 绘制二维码将qrencode生成的矩阵绘制到QImage上QPainterpainter(qrImage);// 创建画家对象绘制目标为qrImagepainter.setPen(Qt::black);// 画笔颜色黑色painter.setBrush(Qt::black);// 画刷颜色黑色// 遍历二维码矩阵的每个像素点for(inty0;yqrSize;y){for(intx0;xqrSize;x){// 矩阵中值为1的点表示黑色像素需要绘制矩形if(qrcode-data[y*qrSizex]1){painter.drawRect(x*scale,y*scale,scale,scale);}}}// 5. 释放qrencode生成的内存关键防止内存泄漏QRcode_free(qrcode);returnqrImage;// 返回生成的二维码图片}// 辅助方法保存二维码到本地文件boolQGetQR::saveQRCode(constQStringdata,constQStringfilePath,intsize){// 1. 先调用generateQRCode生成图片QImage qrImagegenerateQRCode(data,size);// 2. 调用QImage的save方法保存支持png/jpg等格式此处用png保证清晰度returnqrImage.save(filePath);}2. 主窗口逻辑MainWindowmainwindow.h mainwindow.cpp主窗口负责界面交互初始化显示默认二维码、读取输入框内容、点击按钮生成新二维码。1头文件mainwindow.h#ifndefMAINWINDOW_H#defineMAINWINDOW_H#includeQMainWindow#includeqgetqr.h// 引入二维码核心类#includeQLabel#includeQDebug#includeQVBoxLayout#includeQString#includeQImageQT_BEGIN_NAMESPACEnamespaceUi{classMainWindow;}// UI类命名空间由uic工具生成QT_END_NAMESPACEclassMainWindow:publicQMainWindow{Q_OBJECT// Qt信号槽机制必须的宏public:MainWindow(QWidget*parentnullptr);// 构造函数~MainWindow();// 析构函数privateslots:// 按钮点击槽函数对应UI中pushButton_2的clicked信号voidon_pushButton_2_clicked();private:Ui::MainWindow*ui;// UI对象指针用于访问界面控件};#endif// MAINWINDOW_H2实现文件mainwindow.cpp#includemainwindow.h#includeui_mainwindow.h// 主窗口构造函数初始化界面生成默认二维码MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){// 1. 初始化UI界面由Qt Designer生成的ui_mainwindow.h实现ui-setupUi(this);// 2. 生成默认二维码字符串xiaogongweiQGetQR qrReader;// 创建二维码生成对象QString qrStringxiaogongwei;// 默认二维码内容QImage myQRqrReader.generateQRCode(qrString);// 生成二维码图片// 3. 保存二维码到本地当前目录下myQR.pngboolisSaveqrReader.saveQRCode(qrString,./myQR.png);if(isSave){// 4. 在Label控件中显示二维码设置图片居中对齐ui-label-setPixmap(QPixmap::fromImage(myQR));ui-label-setAlignment(Qt::AlignCenter);qDebug()QR code saved successfully!;// 调试输出}else{qDebug()Failed to save QR code.;// 保存失败提示}}// 析构函数释放UI对象内存MainWindow::~MainWindow(){deleteui;}// 按钮点击槽函数生成自定义字符串的二维码voidMainWindow::on_pushButton_2_clicked(){// 1. 创建二维码生成对象QGetQR qrReader;// 2. 读取输入框lineEdit的内容作为二维码字符串QString qrStringui-lineEdit-text();// 3. 生成二维码图片QImage myQRqrReader.generateQRCode(qrString);// 4. 保存新二维码到本地覆盖原有myQR.pngboolisSaveqrReader.saveQRCode(qrString,./myQR.png);if(isSave){// 5. 更新Label控件显示新二维码ui-label-setPixmap(QPixmap::fromImage(myQR));ui-label-setAlignment(Qt::AlignCenter);qDebug()New QR code saved successfully!;}else{qDebug()Failed to save new QR code.;}}3. 程序入口main.cpp#includemainwindow.h#includeQApplicationintmain(intargc,char*argv[]){// 1. 创建Qt应用程序对象必须QApplicationa(argc,argv);// 2. 创建主窗口对象MainWindow w;// 3. 显示主窗口w.show();// 4. 进入应用程序事件循环阻塞直到程序退出returna.exec();}4. UI界面设计mainwindow.ui通过Qt Designer设计界面核心控件布局控件类型控件名称作用QLabellabel显示二维码图片QLineEditlineEdit输入自定义二维码字符串QPushButtonpushButton_2触发生成新二维码的按钮布局建议垂直布局QVBoxLayoutLineEdit在上PushButton居中Label在下设置Label的最小尺寸如200x200确保二维码显示完整五、编译与运行步骤1. 编译步骤打开Qt Creator导入项目选择.pro文件确认.pro文件中LIBS -lqrencode配置正确且qrencode库已安装点击“构建”按钮锤子图标等待编译完成若编译报错undefined reference to QRcode_encodeString检查qrencode库是否链接成功或库路径是否正确若报错fatal error: qrencode.h: No such file or directory检查头文件是否复制到Qt的include目录。2. 运行效果程序启动后主窗口自动生成字符串xiaogongwei的二维码显示在Label中并保存为myQR.png在LineEdit中输入自定义字符串如“Hello Qt!”、“测试中文”点击按钮pushButton_2Label会更新为新字符串的二维码同时覆盖myQR.png。六、功能扩展与优化建议1. 基础扩展支持自定义二维码尺寸添加SpinBox控件让用户选择生成的二维码大小支持自定义保存路径添加QFileDialog让用户选择保存位置和文件名支持不同纠错等级提供下拉框选择L/M/Q/H纠错等级支持中文/特殊字符确保字符串转UTF8编码本程序已支持需确保qrencode库版本兼容。2. 进阶优化内存优化将QGetQR对象改为单例模式避免重复创建异步生成二维码生成耗时大字符串时用Qt线程QThread异步生成避免界面卡顿样式美化给二维码添加边框、背景色或支持透明背景批量生成读取文本文件中的多行字符串批量生成二维码图片。七、常见问题与解决方案1. 编译报错找不到qrencode库解决方案确认qrencode库已安装在.pro文件中指定库的绝对路径如LIBS -L/path/to/qrencode/lib -lqrencode INCLUDEPATH /path/to/qrencode/include2. 二维码生成后显示空白解决方案检查输入字符串是否为空检查QRcode_encodeString返回值是否为NULL可能是字符串过长或版本过低确认缩放比例scale≥1避免绘制区域为0。3. 中文显示乱码解决方案确保字符串转UTF8编码data.toUtf8().constData()确认qrencode库启用UTF8模式QRcode_encodeString最后一个参数为1测试环境的字符编码为UTF8。八、完整源码汇总1. qgetqr.h#ifndefQGETQR_H#defineQGETQR_H#includeQImage#includeQString#includeQPainter#includeqrencode.hclassQGetQR{public:QGetQR();QImagegenerateQRCode(constQStringdata,intsize200);boolsaveQRCode(constQStringdata,constQStringfilePath,intsize200);};#endif// QGETQR_H2. qgetqr.cpp#includeqgetqr.hQGetQR::QGetQR(){}QImageQGetQR::generateQRCode(constQStringdata,intsize){QImageqrImage(size,size,QImage::Format_ARGB32);qrImage.fill(Qt::white);QRcode*qrcodeQRcode_encodeString(data.toUtf8().constData(),5,QR_ECLEVEL_M,QR_MODE_8,1);if(!qrcode){returnqrImage;}intqrSizeqrcode-width;intscalesize/qrSize;if(scale1)scale1;QPainterpainter(qrImage);painter.setPen(Qt::black);painter.setBrush(Qt::black);for(inty0;yqrSize;y){for(intx0;xqrSize;x){if(qrcode-data[y*qrSizex]1){painter.drawRect(x*scale,y*scale,scale,scale);}}}QRcode_free(qrcode);returnqrImage;}boolQGetQR::saveQRCode(constQStringdata,constQStringfilePath,intsize){QImage qrImagegenerateQRCode(data,size);returnqrImage.save(filePath);}3. mainwindow.h#ifndefMAINWINDOW_H#defineMAINWINDOW_H#includeQMainWindow#includeqgetqr.h#includeQLabel#includeQDebug#includeQVBoxLayout#includeQString#includeQImageQT_BEGIN_NAMESPACEnamespaceUi{classMainWindow;}QT_END_NAMESPACEclassMainWindow:publicQMainWindow{Q_OBJECTpublic:MainWindow(QWidget*parentnullptr);~MainWindow();privateslots:voidon_pushButton_2_clicked();private:Ui::MainWindow*ui;};#endif// MAINWINDOW_H4. mainwindow.cpp#includemainwindow.h#includeui_mainwindow.hMainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui-setupUi(this);QGetQR qrReader;QString qrStringxiaogongwei;QImage myQRqrReader.generateQRCode(qrString);boolisSaveqrReader.saveQRCode(qrString,./myQR.png);if(isSave){ui-label-setPixmap(QPixmap::fromImage(myQR));ui-label-setAlignment(Qt::AlignCenter);qDebug()QR code saved successfully!;}else{qDebug()Failed to save QR code.;}}MainWindow::~MainWindow(){deleteui;}voidMainWindow::on_pushButton_2_clicked(){QGetQR qrReader;QString qrStringui-lineEdit-text();QImage myQRqrReader.generateQRCode(qrString);boolisSaveqrReader.saveQRCode(qrString,./myQR.png);if(isSave){ui-label-setPixmap(QPixmap::fromImage(myQR));ui-label-setAlignment(Qt::AlignCenter);qDebug()New QR code saved successfully!;}else{qDebug()Failed to save new QR code.;}}5. main.cpp#includemainwindow.h#includeQApplicationintmain(intargc,char*argv[]){QApplicationa(argc,argv);MainWindow w;w.show();returna.exec();}6. 项目配置文件QRCodeGenerator.proQT core gui widgets CONFIG c11 LIBS -lqrencode TARGET QRCodeGenerator TEMPLATE app SOURCES main.cpp \ mainwindow.cpp \ qgetqr.cpp HEADERS mainwindow.h \ qgetqr.h FORMS mainwindow.ui九、总结本文详细讲解了基于Qtqrencode实现二维码生成的完整流程从环境准备、代码解析到编译运行覆盖了核心逻辑和常见问题。该程序具备基础的二维码生成、显示、保存功能且代码结构清晰、易扩展适合Qt初学者学习和二次开发。如果本文对你有帮助欢迎点赞、收藏、关注如有问题可在评论区留言交流。

相关新闻

Profinet 转 Modbus 智能网关连接 DINGS 鼎智驱动器配置实施报告

Profinet 转 Modbus 智能网关连接 DINGS 鼎智驱动器配置实施报告

Profinet 转 Modbus 智能网关连接 DINGS 鼎智驱动器配置实施报告实施人员: 自动化工程部
, 西门子 S7-1200/1500 PLC (Profinet 协议)协议转换网关: Profinet 转 Modbus RTU 智能网关 (WL-ABC3010)从站执行机构: DINGS 鼎智伺服驱…

2026/5/17 7:13:55 阅读更多 →
【开题答辩全过程】以 购物网站设计与实现为例,包含答辩的问题和答案

【开题答辩全过程】以 购物网站设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

2026/7/3 2:15:13 阅读更多 →
SQL 核心概念:JOIN 和 UNION 到底有什么区别?

SQL 核心概念:JOIN 和 UNION 到底有什么区别?

🗂️ SQL 核心概念:JOIN 和 UNION 到底有什么区别?一个比喻彻底搞懂,再也不混淆📅 2024 | 🗄️ SQL技术博客 | 🏷️ MySQL JOIN UNION 数据库📖 先说结论 很多初学者容易把 JOIN …

2026/7/3 5:43:52 阅读更多 →

最新新闻

Optimus钩子(Hooks)机制详解:实现数据转换后处理的完整教程

Optimus钩子(Hooks)机制详解:实现数据转换后处理的完整教程

Optimus钩子(Hooks)机制详解:实现数据转换后处理的完整教程 【免费下载链接】optimus Optimus is an easy-to-use, reliable, and performant workflow orchestrator for data transformation, data modeling, pipelines, and data quality m…

2026/7/4 8:01:13 阅读更多 →
CANN/ge LLM集群连接API

CANN/ge LLM集群连接API

# link_clusters 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorc…

2026/7/4 8:01:13 阅读更多 →
计算机毕业设计之springboot营养配餐管理系统

计算机毕业设计之springboot营养配餐管理系统

随着当今网络的发展,时代的进步,各行各业也在发生着变化,于是网络已经逐步进入人们的生活,给我们生活或者工作提供了新的方向新的可能。 本毕业设计的内容是设计实现一个基于springboot框架的营养配餐管理系统。它是以java语言&am…

2026/7/4 7:59:12 阅读更多 →
如何轻松抢到B站会员购热门门票:开源抢票工具的终极解决方案

如何轻松抢到B站会员购热门门票:开源抢票工具的终极解决方案

如何轻松抢到B站会员购热门门票:开源抢票工具的终极解决方案 【免费下载链接】biliTickerBuy b站会员购购票辅助工具 项目地址: https://gitcode.com/GitHub_Trending/bi/biliTickerBuy 还在为抢不到B站会员购的热门门票而烦恼吗?每次心仪的漫展、…

2026/7/4 7:57:11 阅读更多 →
地平线征程5芯片与iCAR V27的智能驾驶技术解析

地平线征程5芯片与iCAR V27的智能驾驶技术解析

1. 地平线HSD iCAR V27上市核心信息速览2024年智能电动车市场迎来重磅新成员——搭载地平线征程系列芯片的iCAR V27正式以16.98万元起售价杀入主流市场。这款定位"年轻人的第一台智能SUV"的车型,在深圳大湾区车展首发当日便斩获超3000台预售订单&#xff…

2026/7/4 7:57:11 阅读更多 →
NeverSink过滤器的《流放之路2》寻宝指南:从新手到专家

NeverSink过滤器的《流放之路2》寻宝指南:从新手到专家

NeverSink过滤器的《流放之路2》寻宝指南:从新手到专家 【免费下载链接】NeverSink-Filter-for-PoE2 This is a lootfilter for the game "Path of Exile 2". It adds colors, sounds, map icons, beams to highlight remarkable gear and inform the use…

2026/7/4 7:53:10 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻