Bootstrap

Qt连接MySQL数据库项目展示


本文基于Qt 5.14.1和MySQL5.5.62通过ODBC将数据库与后端连接在一起。

一、设计要求

  • 某简易的教务管理系统有两类人员:学生、管理员。
  • 学生包括:学号、姓名、性别、系别、专业、政治面貌、出生日期、电话号码。
  • 整个系统是多类人员使用,所以要有登录界面作为中转站,实现对不同类人员的端口的界面交互。
  • 学生端只具备修改自己的密码和查看自己的个人资料,如个人信息、课表、成绩、考试计划。
  • 管理员端可以查看全部学生的信息,及其对学生信息的增删改查。

二、系统的整个功能模块

在这里插入图片描述

三、重要功能

1. 添加信息

  从UI界面获取用户输入的信息,传入数据库,SQL语句,将SQL发送到数据库端执行,增加数据库的信息,同时,在UI界面表格界面增加一行,并显示其信息。如果添加的信息所对应用户的学号不存在,将弹出添加失败的窗口,反之,弹出添加成功的窗口

void Function::addRecord(QSqlDatabase db, QString str[], QTableWidget *table, QString sql, int size, bool &isEdit)
{
    int current;
    bool isSuccess;
    QWidget qw;
    QSqlQuery query(db);
    isEdit = false;
    if(table->currentRow()==-1)
        current = 0;
    else
        current = table->currentRow();
    isSuccess = query.exec(sql);
    if(isSuccess) {
        QMessageBox::information(&qw, "消息", "添加成功");
        if(table->rowCount()) {
            table->insertRow(current);
            for(int k = 0; k < size; k++) {
                table->setItem(current, k, new QTableWidgetItem(str[k]));
                table->item(current, k)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
            }
            table->resizeColumnsToContents();
            table->resizeRowsToContents();
        }
    }
    else{
        QMessageBox::critical(&qw, "消息", "添加失败");
        db.close();
        db.open();
	}
}

2. 删除信息

  从UI界面获取当前用户所选中的行,传入数据库,SQL语句,将SQL发送到数据库端执行,删除数据库相应的信息,同时,在UI界面表格界面删除用户所选中的行。接着,弹出是否删除的窗口,让用户选择的权限

void Function::deleteRecord(QTableWidget *table, QString sql, QSqlDatabase db, bool &isEdit)
{
    isEdit = false;
    QWidget qw;
    bool isSuccess;
    QSqlQuery query(db);
    QString no = table->item(table->currentRow() , 0)->text();
    QString subject = table->item(table->currentRow(), 1)->text();
    if(QMessageBox::Yes == QMessageBox::warning(&qw, "删除", "是否删除", QMessageBox::Yes | QMessageBox::No)) {
        table->removeRow(table->currentRow());
        sql = sql + " where no = " + no + " and subject = '" + subject + "'";
        isSuccess = query.exec(sql);
        if(isSuccess)
            QMessageBox::information(&qw, "消息", "删除成功");
        else {
            QMessageBox::critical(&qw, "消息", "删除失败");
            db.close();
            db.open();
        }
    }
}

3. 修改信息

  从UI界面获取到用户修改的信息,传入数据库,SQL语句,将SQL发送到数据库端执行,修改数据库相应的信息。如果修改的信息不符合标准,将弹出修改失败的窗口,反之弹出修改成功的窗口

void Function::updateRecord(QTableWidget *table, QString sql, QSqlDatabase db, bool isEdit, QString tmpNo, QString tmpSubject, QString name[])
{
    if(isEdit) {
        QWidget qw;
        bool isSuccess;
        QSqlQuery query(db);
        QString no = table->item(table->currentRow() , 0)->text(),
                subject = table->item(table->currentRow(), 1)->text();
        QString tmp = table->item(table->currentRow(), table->currentColumn())->text();
        if(table->currentColumn() == 0)
            no = tmpNo;
        else if(table->currentColumn() == 1)
            subject = tmpSubject;       
        sql = sql + " set " + name[table->currentColumn()] + " = '" + tmp + "' where no = " + no +
              " and subject = '" + subject + "'";
        isSuccess = query.exec(sql);
        if(isSuccess)
            QMessageBox::information(&qw, "消息", "修改成功");
        else {
            QMessageBox::critical(&qw, "消息", "修改失败");
            db.close();
            db.open();
        }
    }
}

4. 显示表格

  传入对应表格指针,及数据库所查询的结果,将查询结果显示在表格中

void People::showTable(QTableWidget *table, QSqlQuery result, QStringList tableHead, QString tableName[])
{
    QWidget qw;
    table->setColumnCount(tableHead.size());
    table->setRowCount(0);
    table->setHorizontalHeaderLabels(tableHead);
    int i = 0;
    while(result.next()) {
        table->insertRow(i);
        for(int j = 0; j < tableHead.size(); j++) {
            table->setItem(i, j, new QTableWidgetItem(result.value(tableName[j]).toString()));
            table->item(i, j)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
        }
        i++;
    }
    table->resizeColumnsToContents();
	table->resizeRowsToContents();
	int width = 0;
    for(int j = 0; j < tableHead.size(); j++)
        width += table->columnWidth(j);
    table->setMaximumWidth(width);
}

5. 修改密码

  首先要从用户输入的信息,经过是否为空判断,原密码是否正确,两个密码是否一致。如果有误,弹出窗口提示用户,如果都通过判断,弹出修改成功信息,退出到登录界面,重新登录

bool People::modifyPassWord(QSqlDatabase db, QLineEdit **lineEdit, QString no)
{       
    QSqlQuery result = db.exec("select * from baseinfor where no = " + no);
    bool flag = true;
    QWidget qw;
    result.next();
    if(lineEdit[0]->text() == "" || lineEdit[1]->text() == "" || lineEdit[2]->text() == "") {
        QMessageBox::warning(&qw, "警告", "密码输入为空");
        flag = false;
    }
    if(flag && result.value("passWord").toString() != lineEdit[0]->text()) {
        QMessageBox::critical(&qw, "错误", "密码错误");
        flag = false;
    }
    if(flag && lineEdit[1]->text() != lineEdit[2]->text()) {
        QMessageBox::critical(&qw, "错误", "两次输入的密码不一致");
        flag = false;
    }
    result.clear();
    if(flag) {
        QSqlQuery query(db);
        QString sql = "update baseInfor set passWord = " +  lineEdit[2]->text() + " where no = " + no;
        bool isSuccess = query.exec(sql);
        if(isSuccess)
            QMessageBox::information(&qw, "消息", "修改密码成功");
        else {
            QMessageBox::critical(&qw, "消息", "修改密码失败");
            flag = false;
            db.close();
            db.open();
        }
    }
    for(int k = 0; k < 3; k++)
        lineEdit[k]->clear();
    return flag;
}

6. 显示课表

  传入对应表格指针,及数据库所查询的结果,将查询结果显示在表格中

void People::showSubject(QTableWidget *table, QSqlQuery result)
{
    table->setColumnCount(8);
    table->setRowCount(7);
    table->setHorizontalHeaderLabels(QStringList()<<"时间"<<"星期一"<<"星期二"<<"星期三"<<"星期四"<<"星期五"<<"星期六"<<"星期日");
    QString name[5] = {"subject", "cout", "num", "location", "teacher"};
    QString week[7] = {"周一", "周二", "周三", "周四", "周五", "周六", "周日"};
    QString date[7] = {"1,2节", "3,4节", "5节", "6,7节", "8,9节", "10,11节", "12节"};
    for(int k = 0; k < 7; k++) {
        table->setItem(k, 0, new QTableWidgetItem(date[k]));
        table->item(k, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    }
    int i = -1, j = -1;
    while(result.next()) {
        QStringList str[4];
        for(int k = 0; k < 4; k++)
            str[k] = result.value(name[k+1]).toString().split(";");
        for(int si = 0; si < str[0].size(); si++) {
            i = -1;
            j = -1;
            QStringList strList = str[1][si].split("第");
            for(int k = 0; k < 7; k++)
                if(strList[0] == week[k]) {
                    j = k + 1;
                    break;
                }
            if(strList.size() > 1)
                for(int k = 0; k < 7; k++)
                    if(strList[1] == date[k]) {
                        i = k;
                        break;
                    }
            if(i != -1 && j != -1) {
                QString data = result.value(name[0]).toString() + "\n" + str[1][si] + "\n" + str[0][si]
                                                                + "\n" + str[3][si] + "\n" + str[2][si];
                if(!(table->item(i,j)==NULL || (table->item(i,j) && table->item(i,j)->text()=="")))
                    data = data + "\n" + "------------------" + "\n" + table->item(i, j)->text();
                table->setItem(i, j, new QTableWidgetItem(data));
                table->item(i, j)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
            }
        }
    }
    table->resizeColumnsToContents();
	table->resizeRowsToContents();
    int width = 25;
    for(int j = 0; j < 8; j++)
        width += table->columnWidth(j);
    table->setMaximumWidth(width);
}

7. 数据库连接

  传入数据库名,数据库管理系统账号和密码,端口号

void Student::connectDb()
{
    db.setHostName("127.0.0.1");
    db.setPort(3306);
    db.setDatabaseName("EMS");
    db.setUserName("root");
    db.setPassword("root");
	db.open();
}

8. 退出

  退出当前界面,返回到登录界面

void Student::quit()
{
    Student::close();
    MainWindow *mw = new MainWindow();
    mw->show();
	db.close();
}

四、项目展示

  • 登录界面

在这里插入图片描述

  • 课表查询界面

在这里插入图片描述

  • 课表录入界面

在这里插入图片描述

  • 成绩查询界面

在这里插入图片描述

五、数据库连接方法

点击下面的链接查看如何使用Qt连接MySQL数据库
连接方法

六、项目源码获取

点击下面的链接可获得整个项目源代码,包括(Qt项目,MySQL源码)
小型教务管理系统

;