小 demo:實現一個數據庫版本的學生管理系統,採用QSqlTableModel做顯示記錄的表格,僅僅使用少量的代碼就可與數據庫進行交互,並完美的滿足需求~~~
code:
// 定義學生類
class Stu
{
public:
std::string id; // 學號
std::string name; // 名字
std::string sex; // 性別
std::string major; // 專業
int grade; // 成績
};
// 初始化表格
void initializeModel(QSqlTableModel *model)
{
model->setTable("STUINFO"); // 設置數據庫名稱
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select(); // 查詢數據庫內所有數據
model->setHeaderData(0, Qt::Horizontal, QObject::tr("學號"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("名字"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("性別"));
model->setHeaderData(3, Qt::Horizontal, QObject::tr("專業"));
model->setHeaderData(4, Qt::Horizontal, QObject::tr("成績"));
}
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
s = new sql();
model = new QSqlTableModel(ui->tableView, s->db);
initializeModel(model);
ui->tableView->setModel(model);
// 錄入
connect(ui->pushButton, &QPushButton::clicked, [&](){
QSqlQuery query;
// 查詢表中是否有該數據
query.exec(tr("select * from STUINFO where id = %1").arg(ui->id_edit->text()));
query.next();
QString ret = query.value(0).toString();
if (ret != "") {
QMessageBox::information(nullptr, "提示", "已有該記錄。");
return;
}
query.exec(tr("insert into STUINFO values(%1, %2, %3, %4, %5)").
arg(ui->id_edit->text()).arg(ui->name_edit->text()).
arg(ui->sex_edit->text()).arg(ui->major_edit->text()).
arg(ui->score_edit->text()));
QMessageBox::information(nullptr, "提示", "錄入成功");
model->select();
});
// 查詢
connect(ui->query_btn, &QPushButton::clicked, [&](){
model->setFilter(tr("id = '%1'").arg(ui->lineEdit->text())); // 設置id過濾器
model->select();
});
// 排序
connect(ui->sort_btn, &QPushButton::clicked, [&](){
model->setFilter(""); // 取消過濾
model->setSort(4, Qt::DescendingOrder); // 按照第五列排序 升序:AscendingOrder 降序:DescendingOrder
model->select();
});
// 刪除
connect(ui->del_btn, &QPushButton::clicked, [=](){
int row = ui->tableView->currentIndex().row(); //獲取選中的行
model->removeRow(row); //刪除該行
int ok = QMessageBox::warning(this,tr("刪除當前行!"),tr("你確定刪除當前行嗎?"),
QMessageBox::Yes,QMessageBox::No);
if(ok == QMessageBox::No) {
model->revertAll(); //如果不刪除,則撤銷
}
else {
model->submitAll(); //否則提交,在數據庫中刪除該行
}
});
// 修改
connect(ui->updata_btn, &QPushButton::clicked, [&](){
int row = ui->tableView->currentIndex().row(); // 獲取選中的行
QSqlRecord record = model->record(row); // 獲取該行記錄(獲取的記錄是在界面上修改過後的)
model->setRecord(row, record); // 再將修改過後的記錄設置
if(model->submitAll()) {
QMessageBox::information(this,tr("info"),tr("succeed"));
}
else {
QMessageBox::information(this,tr("info"),tr("failed"));
}
});
}