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初学者学习和二次开发。如果本文对你有帮助欢迎点赞、收藏、关注如有问题可在评论区留言交流。