1. 项目概述与核心需求
在Qt框架中实现用户管理系统是许多桌面应用开发中的常见需求。这次我们要构建一个完整的用户管理模块,包含用户添加、编辑和删除三大核心功能。这个模块将采用SQLite作为本地数据库存储方案,通过Qt的SQL模块实现数据持久化。
这个系统的独特之处在于采用了"窗体复用"的设计理念 - 添加和编辑功能共用一个对话框窗体,通过内部状态标识来区分操作模式。这种设计不仅能减少代码重复,还能保持UI风格的一致性,提升用户体验。作为开发者,我们需要特别注意数据绑定的安全性、窗体交互的流畅性以及异常情况的处理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据库设计与连接实现
2.1 SQLite数据库配置
我们选择SQLite作为本地数据库,主要考虑到它的轻量级特性和零配置优势。在Qt中使用SQLite需要先在.pro文件中添加sql模块:
qmake复制QT += sql
数据库连接和初始化的核心代码如下:
cpp复制// 在SettingsView构造函数中初始化数据库
DB = QSqlDatabase::addDatabase("QSQLITE");
DB.setDatabaseName(QApplication::applicationDirPath() + "/data.db3");
if (!DB.open()) {
qDebug() << "数据库连接失败:" << DB.lastError().text();
}
提示:建议将数据库文件放在应用程序目录下的data子目录中,避免权限问题。在Windows上可能需要特别注意UAC虚拟化导致的路径问题。
2.2 用户表结构设计
用户表(users)的设计需要考虑各种用户属性,以下是推荐的字段结构:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INTEGER | 自增主键 |
| user_id | VARCHAR(32) | 用户唯一标识 |
| user_name | VARCHAR(64) | 登录用户名 |
| real_name | VARCHAR(64) | 真实姓名 |
| password | VARCHAR(64) | 密码(MD5加密存储) |
| gname | VARCHAR(32) | 所属班组 |
| position | VARCHAR(32) | 职务 |
| department | VARCHAR(32) | 部门 |
| gender | TINYINT | 性别(1男/2女) |
| age | INTEGER | 年龄 |
| phone | VARCHAR(20) | 手机号 |
| description | TEXT | 备注信息 |
创建表的SQL语句:
sql复制CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id VARCHAR(32) NOT NULL UNIQUE,
user_name VARCHAR(64) NOT NULL,
real_name VARCHAR(64),
password VARCHAR(64) NOT NULL,
gname VARCHAR(32),
position VARCHAR(32),
department VARCHAR(32),
gender TINYINT DEFAULT 1,
age INTEGER,
phone VARCHAR(20),
description TEXT
);
3. 用户管理界面实现
3.1 主界面设计与数据展示
主界面采用QTableWidget展示用户列表,通过水平表头设置各列属性:
cpp复制// 在SettingsView构造函数中初始化表格
ui->tw_users->setColumnCount(12); // 12列对应12个字段
QStringList headers;
headers << "ID" << "用户ID" << "用户名" << "真实姓名" << "密码"
<< "班组" << "职务" << "部门" << "性别" << "年龄"
<< "手机" << "描述";
ui->tw_users->setHorizontalHeaderLabels(headers);
// 设置描述列自动拉伸
ui->tw_users->horizontalHeader()->setSectionResizeMode(11, QHeaderView::Stretch);
数据刷新功能通过refresh()方法实现,核心逻辑是执行SQL查询并填充表格:
cpp复制void SettingsView::refresh() {
if (!DB.isOpen() && !DB.open()) {
return;
}
QSqlQuery query_user("SELECT * FROM users");
ui->tw_users->setRowCount(0); // 清空现有数据
int row = 0;
while (query_user.next()) {
ui->tw_users->insertRow(row);
// 依次设置各列数据
for (int col = 0; col < 12; ++col) {
QTableWidgetItem *item = new QTableWidgetItem(
query_user.value(col).toString());
item->setTextAlignment(Qt::AlignHCenter | Qt::Ali
