Qt二维码生成器项目开发教程 - 从零开始构建专业级QR码生成工具
项目概述
本项目是一个基于Qt框架开发的专业级二维码生成器,集成了开源的qrencode库,提供完整的QR码生成、预览、保存和分享功能。项目采用C++语言开发,使用Qt的信号槽机制实现界面交互,通过qrencode库实现高质量的二维码编码算法。

项目特点:
- 🎨 现代化UI设计,支持自定义颜色和样式
 - 🔧 完整的参数配置(纠错级别、尺寸、边距)
 - 📱 实时预览功能
 - 💾 多种输出格式(保存图片、复制到剪贴板)
 - 🌍 多语言国际化支持(中文/英文)
 - 🛡️ 完善的错误处理和用户提示
 - 📊 进度条显示生成状态
 
源代码下载: https://download.csdn.net/download/weixin_42059464/91726317
技术栈
- 开发语言: C++
 - GUI框架: Qt 5.9.9
 - 编译器: MinGW32
 - 第三方库: qrencode(QR码编码库)
 - 开发工具: Qt Creator
 - 操作系统: Windows 10
 - 国际化: Qt Linguist
 
项目结构
20_QRCodeGenerator/
├── 20_QRCodeGenerator.pro      # Qt项目配置文件
├── main.cpp                    # 程序入口文件
├── widget.h                    # 主窗口类头文件
├── widget.cpp                  # 主窗口类实现文件
├── widget.ui                   # UI设计文件
├── resources.qrc               # 资源文件
├── qrcode/                     # qrencode库源码
│   ├── qrencode.h             # 主要API头文件
│   ├── qrencode.c             # 核心编码实现
│   ├── qrinput.c              # 输入处理
│   ├── qrspec.c               # QR码规格
│   ├── rscode.c               # Reed-Solomon编码
│   └── ...                    # 其他库文件
└── translations/               # 国际化翻译文件
    ├── qrcodegen_zh_CN.ts     # 中文翻译
    └── qrcodegen_en_US.ts     # 英文翻译
        核心功能实现
1. 界面设计

1.1 整体布局设计
采用左右分栏布局,左侧为控制面板,右侧为预览区域:
            
            
              cpp
              
              
            
          
          void Widget::setupUI()
{
    // 创建中央部件
    QWidget *centralWidget = new QWidget(this);
    setCentralWidget(centralWidget);
    
    // 创建主布局
    QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);
    
    // 创建内容区域
    QHBoxLayout *contentLayout = new QHBoxLayout();
    
    // 左侧输入和控制面板
    QVBoxLayout *leftLayout = new QVBoxLayout();
    
    // 右侧预览区域
    QVBoxLayout *rightLayout = new QVBoxLayout();
    
    contentLayout->addLayout(leftLayout, 1);  // 左侧占1份
    contentLayout->addLayout(rightLayout, 2); // 右侧占2份
}
        1.2 分组框设计
使用QGroupBox将功能模块分组,提高界面组织性:
            
            
              cpp
              
              
            
          
          // 文本输入区域
inputGroup = new QGroupBox(getText("input_content"));
inputGroup->setStyleSheet("QGroupBox { font-weight: bold; font-size: 14px; }");
QVBoxLayout *inputLayout = new QVBoxLayout(inputGroup);
// 参数设置区域
settingsGroup = new QGroupBox(getText("settings"));
settingsGroup->setStyleSheet("QGroupBox { font-weight: bold; font-size: 14px; }");
QGridLayout *settingsLayout = new QGridLayout(settingsGroup);
// 操作按钮区域
actionGroup = new QGroupBox(getText("actions"));
actionGroup->setStyleSheet("QGroupBox { font-weight: bold; font-size: 14px; }");
QGridLayout *actionLayout = new QGridLayout(actionGroup);
        1.3 样式设计
采用现代化的Fusion风格,自定义CSS样式表:
            
            
              cpp
              
              
            
          
          void Widget::applyStyle()
{
    // 设置应用程序样式
    QApplication::setStyle(QStyleFactory::create("Fusion"));
    
    // 自定义样式表
    QString styleSheet = R"(
        QWidget {
            font-family: "Microsoft YaHei", "SimHei", sans-serif;
            font-size: 12px;
        }
        
        QGroupBox {
            font-weight: bold;
            border: 2px solid #cccccc;
            border-radius: 8px;
            margin-top: 1ex;
            padding-top: 10px;
            background-color: #f8f9fa;
        }
        
        QPushButton {
            border: 2px solid #3498db;
            border-radius: 5px;
            padding: 8px 16px;
            background-color: #3498db;
            color: white;
            font-weight: bold;
        }
        
        QPushButton:hover {
            background-color: #2980b9;
            border-color: #2980b9;
        }
    )";
    
    setStyleSheet(styleSheet);
}
        2. 信号槽机制
2.1 信号槽连接
通过connect函数建立界面组件与处理函数的连接:
            
            
              cpp
              
              
            
          
          void Widget::createConnections()
{
    // 核心功能按钮连接
    connect(generateBtn, &QPushButton::clicked, this, &Widget::generateQRCode);
    connect(saveBtn, &QPushButton::clicked, this, &Widget::saveQRCode);
    connect(copyBtn, &QPushButton::clicked, this, &Widget::copyQRCode);
    connect(clearBtn, &QPushButton::clicked, this, &Widget::clearContent);
    
    // 参数设置连接
    connect(foregroundColorBtn, &QPushButton::clicked, this, &Widget::selectForegroundColor);
    connect(backgroundColorBtn, &QPushButton::clicked, this, &Widget::selectBackgroundColor);
    
    // 实时更新连接
    connect(sizeSlider, &QSlider::valueChanged, this, &Widget::updatePreview);
    connect(marginSlider, &QSlider::valueChanged, this, &Widget::updatePreview);
    connect(errorCorrectionCombo, QOverload<const QString &>::of(&QComboBox::currentTextChanged),
            this, &Widget::updatePreview);
}
        2.2 菜单栏信号槽
实现菜单栏的功能连接:
            
            
              cpp
              
              
            
          
          void Widget::setupMenuBar()
{
    menuBarPtr = menuBar();
    
    // 文件菜单
    fileMenu = menuBarPtr->addMenu(getText("file_menu"));
    QAction *newAction = fileMenu->addAction(getText("new"));
    QAction *saveAction = fileMenu->addAction(getText("save"));
    QAction *printAction = fileMenu->addAction(getText("print"));
    fileMenu->addSeparator();
    QAction *exitAction = fileMenu->addAction(getText("exit"));
    
    // 连接菜单动作
    connect(newAction, &QAction::triggered, this, &Widget::clearContent);
    connect(saveAction, &QAction::triggered, this, &Widget::saveQRCode);
    connect(printAction, &QAction::triggered, this, &Widget::printQRCode);
    connect(exitAction, &QAction::triggered, this, &QApplication::quit);
}
        3. QR码生成算法
3.1 qrencode库集成
项目集成了开源的qrencode库,提供高质量的QR码编码功能:
            
            
              cpp
              
              
            
          
          QImage Widget::generateQRCodeImage(const QString &text, int size, QRecLevel errorCorrectionLevel)
{
    // 输入验证
    if (text.isEmpty()) {
        return QImage();
    }
    
    // 使用qrencode库生成二维码数据结构
    QRcode *qrcode = QRcode_encodeString(text.toUtf8().constData(), 
                                        2,  // 版本 (1-40)
                                        errorCorrectionLevel,  // 纠错级别
                                        QR_MODE_8,     // 编码模式
                                        1);            // 大小写敏感
    
    if (!qrcode) {
        return QImage();
    }
    
    // 计算二维码的实际尺寸(包含边距)
    int qrWidth = qrcode->width;
    int finalSize = size;
    int margin = marginSize;
    
    // 创建图像
    QImage image(finalSize, finalSize, QImage::Format_RGB32);
    image.fill(backgroundColor);
    
    // 计算缩放比例
    int scale = (finalSize - 2 * margin) / qrWidth;
    int offset = (finalSize - qrWidth * scale) / 2;
    
    // 绘制二维码
    QPainter painter(&image);
    painter.setPen(Qt::NoPen);
    painter.setBrush(foregroundColor);
    
    for (int y = 0; y < qrWidth; y++) {
        for (int x = 0; x < qrWidth; x++) {
            if (qrcode->data[y * qrWidth + x] & 1) {
                painter.drawRect(offset + x * scale, offset + y * scale, scale, scale);
            }
        }
    }
    
    // 释放QR码数据结构
    QRcode_free(qrcode);
    
    return image;
}
        3.2 纠错级别支持
支持四种纠错级别,适应不同的使用场景:
            
            
              cpp
              
              
            
          
          void Widget::generateQRCode()
{
    // 获取当前设置的参数
    qrCodeSize = sizeSlider->value();
    marginSize = marginSlider->value();
    
    // 根据下拉框选择确定纠错级别
    QRecLevel errorCorrectionLevel = QR_ECLEVEL_Q; // 默认Q级别
    QString currentErrorCorrection = errorCorrectionCombo->currentText();
    if (currentErrorCorrection.contains("L")) {
        errorCorrectionLevel = QR_ECLEVEL_L;  // L级别:7%纠错能力
    } else if (currentErrorCorrection.contains("M")) {
        errorCorrectionLevel = QR_ECLEVEL_M;  // M级别:15%纠错能力
    } else if (currentErrorCorrection.contains("Q")) {
        errorCorrectionLevel = QR_ECLEVEL_Q;  // Q级别:25%纠错能力
    } else if (currentErrorCorrection.contains("H")) {
        errorCorrectionLevel = QR_ECLEVEL_H;  // H级别:30%纠错能力
    }
    
    // 调用核心算法生成二维码图像
    currentQRCode = generateQRCodeImage(text, qrCodeSize, errorCorrectionLevel);
}
        4. 国际化支持
4.1 翻译文件结构
使用Qt Linguist工具管理多语言翻译:
            
            
              xml
              
              
            
          
          <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
    <name>Widget</name>
    <message>
        <source>QR Code Generator v1.0</source>
        <translation>二维码生成器 v1.0</translation>
    </message>
    <message>
        <source>Input Content</source>
        <translation>输入内容</translation>
    </message>
    <message>
        <source>Generate QR Code</source>
        <translation>生成二维码</translation>
    </message>
</context>
</TS>
        4.2 语言切换实现
动态加载翻译文件,支持运行时语言切换:
            
            
              cpp
              
              
            
          
          void Widget::loadLanguage(const QString &language)
{
    // 移除当前翻译器
    if (translator) {
        QApplication::removeTranslator(translator);
    }
    
    // 加载新的翻译文件
    QString translationFile = QString(":/translations/qrcodegen_%1.qm").arg(language);
    if (translator->load(translationFile)) {
        QApplication::installTranslator(translator);
        currentLanguage = language;
    }
}
void Widget::retranslateUI()
{
    // 重新翻译界面文本
    setWindowTitle(getText("window_title"));
    inputGroup->setTitle(getText("input_content"));
    settingsGroup->setTitle(getText("settings"));
    actionGroup->setTitle(getText("actions"));
    previewGroup->setTitle(getText("qr_code_preview"));
    
    // 更新按钮文本
    generateBtn->setText(getText("generate_qr_code"));
    saveBtn->setText(getText("save_image"));
    copyBtn->setText(getText("copy_to_clipboard"));
    clearBtn->setText(getText("clear_content"));
}
        5. 文件操作功能
5.1 图片保存功能
支持多种图片格式的保存:
            
            
              cpp
              
              
            
          
          void Widget::saveQRCode()
{
    if (currentQRCode.isNull()) {
        QMessageBox::warning(this, getText("warning"), getText("no_qr_code_to_save"));
        return;
    }
    
    QString fileName = QFileDialog::getSaveFileName(this,
        getText("save_image"), 
        QString("QRCode_%1.png").arg(QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss")),
        "PNG Files (*.png);;JPEG Files (*.jpg);;BMP Files (*.bmp);;All Files (*)");
    
    if (!fileName.isEmpty()) {
        if (currentQRCode.save(fileName)) {
            showStatusMessage(getText("saved_success"));
            QMessageBox::information(this, getText("success"), getText("saved_success"));
        } else {
            QMessageBox::critical(this, getText("error"), getText("save_failed"));
        }
    }
}
        5.2 剪贴板复制功能
支持一键复制到系统剪贴板:
            
            
              cpp
              
              
            
          
          void Widget::copyQRCode()
{
    if (currentQRCode.isNull()) {
        QMessageBox::warning(this, getText("warning"), getText("no_qr_code_to_copy"));
        return;
    }
    
    QClipboard *clipboard = QApplication::clipboard();
    clipboard->setPixmap(QPixmap::fromImage(currentQRCode));
    
    showStatusMessage(getText("copied_to_clipboard"));
    QMessageBox::information(this, getText("success"), getText("copied_to_clipboard"));
}
        6. 状态管理和用户反馈
6.1 进度条显示
在生成过程中显示进度条,提供用户反馈:
            
            
              cpp
              
              
            
          
          void Widget::generateQRCode()
{
    // 显示进度条,提示用户正在生成
    progressBar->setVisible(true);
    progressBar->setRange(0, 0); // 设置为不确定模式
    showStatusMessage(getText("generating"));
    
    // 生成二维码...
    
    // 隐藏进度条
    progressBar->setVisible(false);
}
        6.2 状态栏消息
通过状态栏显示操作结果和提示信息:
            
            
              cpp
              
              
            
          
          void Widget::showStatusMessage(const QString &message, int timeout)
{
    if (statusBarPtr) {
        statusBarPtr->showMessage(message, timeout);
    }
}
void Widget::setupStatusBar()
{
    statusBarPtr = statusBar();
    statusBarPtr->setStyleSheet("QStatusBar { background-color: #f0f0f0; border-top: 1px solid #ccc; }");
    showStatusMessage(getText("ready"));
}
        开发环境搭建
1. 安装Qt开发环境
- 下载并安装Qt 5.9.9
 - 配置MinGW32编译器
 - 安装Qt Creator IDE
 
2. 项目配置
在.pro文件中配置项目依赖:
            
            
              qmake
              
              
            
          
          # 包含Qt核心模块和GUI模块
QT       += core gui
# Qt5及以上版本需要包含widgets模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
# 启用C++11标准
CONFIG += c++11
# 包含路径设置
INCLUDEPATH += $$PWD/qrcode       # 添加qrencode库头文件路径
# 源文件列表
SOURCES += \
    main.cpp \
    widget.cpp \
    qrcode/qrencode.c \
    qrcode/qrinput.c \
    qrcode/qrspec.c \
    qrcode/rscode.c \
    # ... 其他qrencode库文件
        3. 编译运行
- 在Qt Creator中打开项目
 - 配置构建套件(选择MinGW32)
 - 点击运行按钮编译并执行程序
 
项目特色功能
1. 实时预览
支持参数调整时的实时预览,用户可以立即看到效果
2. 自定义样式
支持自定义前景色和背景色,满足不同场景需求
3. 多种输出方式
支持保存为图片文件、复制到剪贴板等多种输出方式
4. 参数化配置
提供完整的参数配置,包括纠错级别、尺寸、边距等
5. 多语言支持
内置中英文双语支持,可扩展其他语言
6. 错误处理
完善的错误处理机制,提供友好的用户提示
扩展功能建议
1. 批量生成
- 支持批量生成多个二维码
 - 从文件导入文本列表
 - 批量保存功能
 
2. 高级样式
- 支持Logo嵌入
 - 渐变色彩效果
 - 圆角二维码
 
3. 扫描功能
- 集成二维码扫描功能
 - 摄像头实时扫描
 - 图片文件扫描
 
4. 历史记录
- 保存生成历史
 - 历史记录管理
 - 快速重用功能
 
5. 网络功能
- 在线二维码生成
 - 云端保存功能
 - 分享功能
 
性能优化建议
1. 内存管理
- 及时释放QR码数据结构
 - 优化图像处理算法
 - 使用智能指针管理资源
 
2. 界面优化
- 异步生成避免界面卡顿
 - 优化大尺寸二维码生成
 - 实现生成进度显示
 
3. 算法优化
- 优化qrencode库调用
 - 实现缓存机制
 - 支持多线程生成
 
常见问题解决
1. 编译错误
问题: 找不到qrencode头文件
解决: 检查.pro文件中的INCLUDEPATH配置
2. 链接错误
问题: 链接qrencode库失败
解决: 确保所有qrencode源文件都已添加到SOURCES中
3. 运行时错误
问题: 生成二维码失败
解决: 检查输入文本是否为空,纠错级别设置是否合理
4. 界面显示问题
问题: 翻译文件未加载
解决: 检查翻译文件路径和格式
总结
本项目展示了Qt框架在专业级应用开发中的强大功能,通过集成第三方库和合理的架构设计,构建了一个功能完整、界面美观的二维码生成器。项目涵盖了Qt开发的核心技术点:
- 信号槽机制: 实现界面交互和事件处理
 - 布局管理: 创建响应式和美观的界面布局
 - 样式设计: 使用QSS实现现代化界面风格
 - 第三方库集成: 集成qrencode库实现专业级QR码生成
 - 国际化支持: 实现多语言界面
 - 文件操作: 支持多种格式的图片保存和剪贴板操作
 - 错误处理: 完善的用户反馈和错误提示机制
 
这个项目适合作为Qt进阶学习的实践项目,展示了如何将Qt框架与第三方库结合,构建功能丰富的桌面应用程序。通过这个项目,可以学习到Qt开发的最佳实践和高级技术。
希望这个教程对您的Qt学习有所帮助!如有问题,欢迎在评论区讨论。
相关资源:
