Qt利用QSqlTableModel與QTableView實現數據庫版簡單學生信息管理系統

小 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"));
        }
    });
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章