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

 

你可能感兴趣的:(QT)