882 字
4 分钟

QSqlTableModel简单例子-学生信息管理系统

2025-11-18
浏览量 加载中...
#include <QtWidgets>
#include <QtSql>
class StudentManager : public QWidget
{
Q_OBJECT
public:
StudentManager(QWidget *parent = nullptr) : QWidget(parent)
{
initializeModel();
setupUI();
setupConnections();
refreshView();
}
private slots:
// 添加新学生记录
void onAddButtonClicked()
{
// 获取当前行数,新行将添加在末尾
int row = model->rowCount();
// 插入新行
if (model->insertRow(row)) {
// 设置新行的默认数据
model->setData(model->index(row, 1), "新学生"); // name列
model->setData(model->index(row, 2), "男"); // sex列
model->setData(model->index(row, 3), 20); // age列
// 提交到数据库
if (!model->submitAll()) {
QMessageBox::warning(this, "错误", "添加记录失败: " +
model->lastError().text());
model->revertAll(); // 撤销更改
} else {
refreshView(); // 刷新视图
}
}
}
// 删除选中记录
void onDeleteButtonClicked()
{
// 获取当前选中的行
QModelIndex currentIndex = tableView->currentIndex();
if (!currentIndex.isValid()) {
QMessageBox::warning(this, "警告", "请先选择要删除的记录");
return;
}
int row = currentIndex.row();
// 显示确认对话框
int ret = QMessageBox::question(this, "确认删除",
"确定要删除选中的记录吗?",
QMessageBox::Yes | QMessageBox::No);
if (ret == QMessageBox::Yes) {
// 删除行
if (model->removeRow(row)) {
// 提交到数据库
if (!model->submitAll()) {
QMessageBox::warning(this, "错误", "删除记录失败: " +
model->lastError().text());
model->revertAll();
} else {
refreshView();
}
}
}
}
// 提交所有更改
void onSubmitButtonClicked()
{
if (model->submitAll()) {
QMessageBox::information(this, "成功", "所有更改已保存到数据库");
} else {
QMessageBox::warning(this, "错误", "提交失败: " +
model->lastError().text());
}
}
// 撤销所有更改
void onRevertButtonClicked()
{
model->revertAll();
refreshView();
QMessageBox::information(this, "信息", "已撤销所有未保存的更改");
}
// 筛选数据
void onFilterChanged()
{
QString filter = filterEdit->text();
if (!filter.isEmpty()) {
// 根据姓名筛选
model->setFilter(QString("name LIKE '%%1%'").arg(filter));
} else {
model->setFilter(""); // 清除筛选条件
}
model->select();
refreshView();
}
private:
void initializeModel()
{
// 初始化数据库连接
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("students.db");
if (!db.open()) {
QMessageBox::critical(nullptr, "错误", "无法打开数据库");
return;
}
// 创建学生表(如果不存在)
QSqlQuery query;
query.exec("CREATE TABLE IF NOT EXISTS student ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"name VARCHAR(40) NOT NULL, "
"sex VARCHAR(10) NOT NULL, "
"age INTEGER NOT NULL, "
"mobile VARCHAR(20), "
"city VARCHAR(40))");
// 插入一些测试数据(如果表是空的)
query.exec("SELECT COUNT(*) FROM student");
if (query.next() && query.value(0).toInt() == 0) {
query.exec("INSERT INTO student (name, sex, age, mobile, city) "
"VALUES ('张三', '男', 20, '13800138000', '北京')");
query.exec("INSERT INTO student (name, sex, age, mobile, city) "
"VALUES ('李四', '女', 22, '13900139000', '上海')");
query.exec("INSERT INTO student (name, sex, age, mobile, city) "
"VALUES ('王五', '男', 21, '13700137000', '广州')");
}
// 创建数据模型
model = new QSqlTableModel(this, db);
model->setTable("student");
// 设置编辑策略:手动提交
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
// 设置排序:按ID升序
model->setSort(0, Qt::AscendingOrder);
// 设置表头标签
model->setHeaderData(0, Qt::Horizontal, tr("ID"));
model->setHeaderData(1, Qt::Horizontal, tr("姓名"));
model->setHeaderData(2, Qt::Horizontal, tr("性别"));
model->setHeaderData(3, Qt::Horizontal, tr("年龄"));
model->setHeaderData(4, Qt::Horizontal, tr("手机"));
model->setHeaderData(5, Qt::Horizontal, tr("城市"));
// 加载数据
model->select();
}
void setupUI()
{
// 创建表格视图
tableView = new QTableView;
tableView->setModel(model);
// 设置表格属性
tableView->setSelectionMode(QAbstractItemView::SingleSelection);
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
tableView->setEditTriggers(QAbstractItemView::DoubleClicked |
QAbstractItemView::EditKeyPressed);
// 设置列宽
tableView->setColumnWidth(0, 60); // ID
tableView->setColumnWidth(1, 100); // 姓名
tableView->setColumnWidth(2, 60); // 性别
tableView->setColumnWidth(3, 60); // 年龄
tableView->setColumnWidth(4, 120); // 手机
tableView->setColumnWidth(5, 100); // 城市
// 创建按钮
QPushButton *addButton = new QPushButton(tr("添加"));
QPushButton *deleteButton = new QPushButton(tr("删除"));
QPushButton *submitButton = new QPushButton(tr("提交"));
QPushButton *revertButton = new QPushButton(tr("撤销"));
// 创建筛选框
filterEdit = new QLineEdit;
filterEdit->setPlaceholderText(tr("输入姓名进行筛选..."));
// 创建按钮布局
QHBoxLayout *buttonLayout = new QHBoxLayout;
buttonLayout->addWidget(addButton);
buttonLayout->addWidget(deleteButton);
buttonLayout->addWidget(submitButton);
buttonLayout->addWidget(revertButton);
buttonLayout->addStretch();
buttonLayout->addWidget(new QLabel(tr("筛选:")));
buttonLayout->addWidget(filterEdit);
// 创建主布局
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(buttonLayout);
mainLayout->addWidget(tableView);
setLayout(mainLayout);
setWindowTitle(tr("学生信息管理系统 - QSqlTableModel示例"));
resize(600, 400);
// 连接信号槽
connect(addButton, &QPushButton::clicked, this, &StudentManager::onAddButtonClicked);
connect(deleteButton, &QPushButton::clicked, this, &StudentManager::onDeleteButtonClicked);
connect(submitButton, &QPushButton::clicked, this, &StudentManager::onSubmitButtonClicked);
connect(revertButton, &QPushButton::clicked, this, &StudentManager::onRevertButtonClicked);
connect(filterEdit, &QLineEdit::textChanged, this, &StudentManager::onFilterChanged);
}
void setupConnections()
{
// 可以在这里添加其他信号连接
}
void refreshView()
{
// 刷新表格显示
tableView->viewport()->update();
}
private:
QSqlTableModel *model;
QTableView *tableView;
QLineEdit *filterEdit;
};
// 主函数
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
StudentManager manager;
manager.show();
return app.exec();
}
#include "main.moc" // 如果使用单独的.cpp文件,不需要这一行,如果以上代码全部放到一个文件中则需要加,例如全部放到main.cpp文件中
QSqlTableModel简单例子-学生信息管理系统
https://demo-firefly.netlify.app/posts/qsqltablemodel-simple-example-student-management-system/
作者
长琴
发布于
2025-11-18
许可协议
CC BY-NC-SA 4.0
最后更新于 2025-11-18,距今已过 3 天

部分内容可能已过时

评论区

目录

Loading ... - Loading ...
封面
Loading ...
Loading ...
0:00 / 0:00