882 字
4 分钟
QSqlTableModel简单例子-学生信息管理系统
#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,距今已过 3 天
部分内容可能已过时