1. 项目概述与核心价值
最近在整理过往项目时,翻到了一个用C++和Qt做的学生成绩管理系统。这玩意儿虽然听起来像是课程设计或者毕业设计的“常客”,但真正动手从零搭建一套,把界面、数据库、业务逻辑都串起来,踩的坑和收获的经验,远比想象中要多。今天我就把这个项目的完整实现思路、关键代码、以及那些教程里不会细说的“坑点”都拆解出来,无论你是刚接触Qt想找个实战项目练手,还是想了解如何用C++构建一个带图形界面的桌面应用,相信都能从中找到参考。
这个系统本质上是一个典型的 CRUD(增删改查)桌面应用 ,核心目标是管理学生的基础信息和各科成绩。它需要提供友好的图形界面供用户操作,背后则通过数据库持久化存储数据。选择C++和Qt这对组合,主要是看中了C++的运行效率和对底层资源的精细控制能力,以及Qt框架在跨平台GUI开发、数据库连接、以及整体架构上的成熟度。最终实现的功能包括用户登录验证、学生信息的表格化展示与编辑、按成绩排序、数据统计汇总等。下面,我就带你一步步拆解这个项目的实现过程。
2. 开发环境搭建与项目初始化
2.1 Qt与工具链选型
工欲善其事,必先利其器。环境配置是第一步,也是最容易让人打退堂鼓的一步。我选择的是 Qt 6.4.1 搭配 MinGW 11.2.0 64-bit 编译套件,并在 Qt Creator 9.0.1 中进行开发。为什么是这套组合?
首先,Qt 6是Qt官方主推的长期支持系列,相较于Qt 5,它在模块化、性能和高DPI支持上都有改进。MinGW是一个Windows下的GNU工具链,它生成的程序不依赖额外的运行时库(比如MSVC的vcredist),发布更简单。Qt Creator是Qt官方的IDE,对Qt项目的支持最为原生和友好,智能提示、UI设计器、调试器集成度都很高。
注意 :如果你在安装后打开Qt Creator,发现构建套件(Kits)里Qt版本显示为“无”或者找不到qmake,这通常是因为Qt Creator没有自动检测到Qt的安装路径。你需要手动在
工具->选项->Kits->Qt Versions中添加qmake.exe的路径(通常在Qt安装目录下的版本号/gcc_64/bin文件夹里)。
2.2 项目创建与基础配置
在Qt Creator中新建项目,选择 Qt Widgets Application 。项目名称定为 StudentScoreSystem 。在 类信息 步骤,基类选择 QMainWindow ,这样会生成一个带菜单栏、状态栏的主窗口类,方便我们后续布局。创建完成后,你会得到一个包含 .pro 项目文件、主程序入口 main.cpp 、主窗口头文件 mainwindow.h 和源文件 mainwindow.cpp ,以及一个UI设计文件 mainwindow.ui 的基础工程。
.pro 文件是Qt项目的核心配置文件,类似于Makefile。我们需要在其中添加必要的模块。打开 StudentScoreSystem.pro ,确保有以下内容:
QT += core gui sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
关键点是 QT += sql ,这行告诉Qt我们需要使用SQL模块来操作数据库。 CONFIG += c++17 则是启用了C++17标准,方便我们使用一些现代C++特性。
2.3 数据库选型与初始化
对于这样一个单机版、轻量级的成绩管理系统, SQLite 是绝佳选择。它是一个进程内的、无服务器的、零配置的、事务性的SQL数据库引擎。简单说,它就是一个文件,不需要安装和配置数据库服务器,非常适合桌面应用。
我们在项目初始化时就需要创建数据库和表。一种常见的做法是在程序第一次运行时检查数据库文件是否存在,如果不存在则创建并初始化表结构。我们在 mainwindow.cpp 的构造函数或一个专门的初始化函数里做这件事。
// mainwindow.cpp 构造函数或初始化函数中
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QMessageBox>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// ... 其他初始化代码 ...
initDatabase();
}
bool MainWindow::initDatabase()
{
// 1. 添加SQLite数据库驱动
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
// 2. 设置数据库文件路径,放在应用程序同级目录下
db.setDatabaseName("student_score.db");
// 3. 打开数据库
if (!db.open()) {
QMessageBox::critical(this, "数据库错误", "无法打开数据库: " + db.lastError().text());
return false;
}
// 4. 创建数据表(如果不存在)
QSqlQuery query;
QString createTableSql = R"(
CREATE TABLE IF NOT EXISTS stu (
id TEXT PRIMARY KEY, -- 学号,设为主键
name TEXT NOT NULL, -- 姓名
class TEXT NOT NULL, -- 班级
chinese REAL DEFAULT 0, -- 语文成绩
math REAL DEFAULT 0, -- 数学成绩
english REAL DEFAULT 0, -- 英语成绩
average REAL GENERATED ALWAYS AS ((chinese + math + english) / 3.0) -- 平均分,计算列
)
)";
if (!query.exec(createTableSql)) {
QMessageBox::critical(this, "数据库错误", "创建表失败: " + query.lastError().text());
return false;
}
qDebug() << "数据库初始化成功!";
return true;
}
这里有几个细节:
-
CREATE TABLE IF NOT EXISTS语句确保了表只会在第一次运行时创建。 - 我将
average(平均分)字段定义为一个 生成列 (GENERATED ALWAYS)。这是SQLite 3.31.0之后引入的特性,它意味着这个列的值由其他列计算得出,不能直接插入或更新。这样做保证了数据的一致性,避免人工计算错误。如果你的SQLite版本较旧,可以去掉这个特性,改为在插入和更新时手动计算。 - 使用
R”()”原始字符串字面量,可以避免在SQL语句中频繁转义引号,让代码更清晰。 - 务必检查每一步数据库操作的返回值,并用
lastError().text()输出错误信息,这是调试数据库问题的关键。
3. 核心功能模块设计与实现
3.1 用户登录与安全验证
任何管理系统,安全入口是必须的。我们设计一个独立的登录对话框。在Qt Creator中,右键项目 -> 添加新文件 -> Qt -> Qt设计师界面类 -> 选择 Dialog without Buttons ,命名为 LoginDialog 。
在 LoginDialog 的UI文件中,拖入两个 QLabel (“账号”、“密码”)、两个 QLineEdit (一个用于密码的需设置 echoMode 为 Password )、一个 QPushButton (“登录”)。
登录逻辑的核心是验证。为了简单演示,我们将管理员账号密码进行MD5加密后存储在一个本地文件(如 admin.txt )中。首次运行时,文件不存在,则使用默认密码创建。
// logindialog.cpp 中的登录按钮点击槽函数
#include <QCryptogra
450



被折叠的 条评论
为什么被折叠?



