乐于分享
好东西不私藏

活动抽奖系统,暗箱操作源码公开

活动抽奖系统,暗箱操作源码公开

欢迎关注《Qt开发宝典》公众号【知识宝库】!
定期持续分享Linux C++、Qt、AI等技术干货。
本期《Qt C++工程师》动手实践系列,第131期。本期我们聚焦一个兼具实用性与学习深度的主题——活动抽奖系统,暗箱操作代码公开本系列文章旨在为关注Qt跨平台开发、Linux C++后端及系统底层架构的开发者,提供一个系统的学习参考。内容将通过原理讲解与实战结合的方式,解析相关核心知识与设计思路,以期对您的技术探索与实践有所裨益。

【技术交流群说明】

欢迎关注《Qt开发宝典》公众号

每日分享Linux C++/Qt实战干货与技术笔记

📌技术交流QQ群:895876809,📌进群下载学习资料。

一、【工程项目运行】

1. 生成测试数据
2. 添加记录数据
3. 添加一二三等奖项
4. 开始抽奖啦
5. 指定刚添加的中奖手机号码:18166667777
开始抽奖操作:
二、【工程项目简介】

2.1 ✨功能特性

🎯【核心功能模块】

1. 员工管理模块

- ✅ 员工信息管理:添加、修改、删除、查询员工信息

- ✅ 信息字段:员工编号、部门、姓名、手机号码

- ✅ 数据验证:实时验证,确保信息完整性

- ✅ 批量操作:支持批量数据管理

- ✅ 表格展示:清晰的表格展示,支持排序和筛选

2. 奖项管理模块

- ✅ 奖项配置:创建、修改、删除奖项

- ✅ 名额管理:灵活配置奖项名额,实时显示已抽/剩余名额

- ✅ 等级设置:支持多层级奖项(特等奖、一等奖、二等奖等)

- ✅ 奖品描述:详细的奖品描述信息

- ✅ 状态显示:已抽完奖项自动标记(灰色显示)

3. 抽奖功能模块

- ✅ 流畅动画:由快到慢的平滑滚动动画效果

- ✅ 实时显示:抽奖过程中实时显示员工信息(姓名、部门、手机号)

- ✅ 智能调整:根据员工数量自动调整滚动时长

- ✅ 防重复机制:多重检查确保已中奖员工不会再次中奖

- ✅ 指定中奖:支持配置指定中奖号码(需密码保护)

- ✅ 结果展示:精美的中奖结果弹出窗口

4. 中奖记录模块

- ✅ 记录查看:完整的中奖历史记录

- ✅ 详细信息:姓名、部门、手机号、奖项、抽奖时间

- ✅ 排序功能:支持多条件排序(按时间倒序)

- ✅ 数据管理:刷新、清空记录功能

5. 系统管理模块

- ✅ 测试数据:快速生成测试数据,方便开发测试

- ✅ 数据清理:清空测试数据功能

- ✅ 配置管理:指定中奖号码配置(密码保护)

- ✅ 系统信息:关于信息显示

🎨【用户体验特性】

- ✅ 现代化UI:渐变背景、圆角设计、阴影效果

- ✅ 响应式设计:支持窗口大小调整,字体自动缩放

- ✅ DPI支持:支持高DPI显示,图标和字体自动缩放

- ✅ 流畅动画:60fps流畅动画效果

- ✅ 实时反馈:操作反馈及时明确

🚀【性能特性】

- ✅ 快速响应:UI响应速度<50ms

- ✅ 高效查询:数据库查询优化,减少50%+查询次数

- ✅ 批量更新:表格加载速度提升80%+

- ✅ 内存优化:内存占用<100MB,无内存泄漏

- ✅ CPU优化:算法优化,CPU占用低

2.2 🛠️技术栈

【核心技术】

- 开发语言:C++17

- UI框架:Qt 6.5

- 数据库:SQLite

- 构建系统:qmake

- 编译器:MinGW 64-bit

【主要依赖】

- Qt模块:

  - Qt Core:核心功能

  - Qt Widgets:UI组件

  - Qt SQL:数据库支持

【设计模式】

- 单例模式:Database、ConfigManager

- 观察者模式:Qt信号槽机制

- RAII模式:资源自动管理

三、【工程项目】部分源码

1. main.cpp

#include"mainwindow.h"#include<QApplication>#include<QStyleFactory>#include<QDir>#include<QStandardPaths>#include<QScreen>#include<QGuiApplication>intmain(int argc, char *argv[]){QApplication app(argc, argv);// 启用高DPI缩放支持(Qt6默认启用,但显式设置更安全)// Qt6会自动处理DPI缩放,确保在不同分辨率下显示正常    QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);// 设置应用程序信息    app.setApplicationName("年度抽奖系统");    app.setApplicationVersion("1.0.0");    app.setOrganizationName("LotterySystem");// 设置现代化样式    app.setStyle(QStyleFactory::create("Fusion"));// 设置数据目录    QString dataDir = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);    QDir dir;if (!dir.exists(dataDir)) {        dir.mkpath(dataDir);    }    MainWindow window;// 设置窗口图标(支持多分辨率,Qt会自动选择合适大小的图标)// QIcon会自动处理DPI缩放,确保在不同分辨率下图标不变形QIcon appIcon(":/new/prefix1/images/logo.ico");// 如果图标文件支持多分辨率,QIcon会自动选择最合适的大小    window.setWindowIcon(appIcon);    app.setWindowIcon(appIcon);  // 同时设置应用程序图标    window.setMinimumWidth(1200);    window.setMinimumHeight(900);    window.show();return app.exec();}

2. mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include<QMainWindow>#include<QTableWidget>#include<QLineEdit>#include<QPushButton>#include<QLabel>#include<QTextEdit>#include<QComboBox>#include<QSpinBox>#include<QTimer>#include<QMenuBar>#include<QStatusBar>#include<QVBoxLayout>#include<QHBoxLayout>#include<QGridLayout>#include<QGroupBox>#include<QTabWidget>#include<QMessageBox>#include<QDialog>#include<QDialogButtonBox>#include<QResizeEvent>#include"employee.h"#include"prize.h"#include"database.h"#include"lotterydraw.h"#include"configmanager.h"#include"testdatagenerator.h"#include"winnerdialog.h"QT_BEGIN_NAMESPACEclassQAction;QT_END_NAMESPACEclassMainWindow : public QMainWindow{    Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);    ~MainWindow();protected:voidresizeEvent(QResizeEvent *event)override;private slots:// 员工管理voidonAddEmployee();voidonUpdateEmployee();voidonDeleteEmployee();voidonRefreshEmployees();// 奖项管理voidonAddPrize();voidonUpdatePrize();voidonDeletePrize();voidonRefreshPrizes();// 抽奖功能voidonStartDraw();voidonStopDraw();voidonPhoneDisplayChanged(const QString &phone);voidonEmployeeDisplayChanged(const Employee &employee);  // 员工信息显示变化voidonDrawFinished(const Employee &employee, const Prize &prize);voidonDrawError(const QString &error);// 菜单功能voidonGenerateTestData();voidonClearTestData();voidonConfigureGuaranteedWinners();voidonAbout();// 记录管理voidonRefreshRecords();voidonClearRecords();private:voidsetupUI();voidsetupMenuBar();voidsetupStatusBar();voidsetupEmployeeTab();voidsetupPrizeTab();voidsetupDrawTab();voidsetupRecordTab();voidapplyModernStyle();voidloadEmployees();voidloadPrizes();voidloadRecords();Employee getSelectedEmployee();Prize getSelectedPrize();voidupdateDrawButtonState();// UI组件    QTabWidget *m_tabWidget;// 员工管理    QTableWidget *m_employeeTable;    QLineEdit *m_empIdEdit;    QLineEdit *m_empDeptEdit;    QLineEdit *m_empNameEdit;    QLineEdit *m_empPhoneEdit;    QPushButton *m_addEmpBtn;    QPushButton *m_updateEmpBtn;    QPushButton *m_deleteEmpBtn;    QPushButton *m_refreshEmpBtn;// 奖项管理    QTableWidget *m_prizeTable;    QLineEdit *m_prizeNameEdit;    QSpinBox *m_prizeCountSpin;    QTextEdit *m_prizeDescEdit;    QSpinBox *m_prizeLevelSpin;    QPushButton *m_addPrizeBtn;    QPushButton *m_updatePrizeBtn;    QPushButton *m_deletePrizeBtn;    QPushButton *m_refreshPrizeBtn;// 抽奖功能    QComboBox *m_prizeCombo;    QLabel *m_phoneDisplayLabel;    QLabel *m_winnerInfoLabel;    QPushButton *m_startDrawBtn;    QPushButton *m_stopDrawBtn;    QGroupBox *m_drawResultBox;    QLabel *m_winnerNameLabel;    QLabel *m_winnerDeptLabel;    QLabel *m_winnerPhoneLabel;    QLabel *m_prizeNameLabel;// 中奖记录    QTableWidget *m_recordTable;    QPushButton *m_refreshRecordBtn;    QPushButton *m_clearRecordBtn;// 核心对象    Database *m_db;    LotteryDraw *m_lotteryDraw;    ConfigManager *m_config;    TestDataGenerator *m_testGenerator;// 状态(必须在核心对象之后声明,以匹配初始化顺序)bool m_isDrawing;};#endif// MAINWINDOW_H

希望本文能为您的C++/Qt学习之旅提供有价值的参考!欢迎关注【Qt开发宝典】微信公众号,获取更多技术干货。