
【技术交流群说明】
欢迎关注《Qt开发宝典》公众号
每日分享Linux C++/Qt实战干货与技术笔记
📌技术交流QQ群:895876809,📌进群下载学习资料。
一、【工程项目运行】
















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
夜雨聆风