Qt+MySQL的学生选课、授课管理课程设计

前言:本课程设计偏重于Qt,数据库设计方面比较简单
花费了一周多的时间学习Qt(B站的黑马程序员视频),边学边弄,遇到了许多问题也基本得到解决

问题知识小集,前辈大佬们的解决方法:

  1. 新版本Qt连接mysql缺少驱动
  2. mysql-connector-c 6.1.10下载,附有libmysql.lib
    下载自己对应的版本,一般32位
  3. qt程序打包
  4. 打包发布出现driver not loaded driver not loaded,就是把之前的libmysql库拉到打包的文件中就可以
  5. QTableview设置某行某列不可编辑(只读,委托)
  6. Qt 标准对话框使用
  7. Qt 数据库错误捕捉与处理
  8. qt的编码格式要和数据库的文本格式一致比如utf-8,不然数据库表格内容会出错

数据库设计

数据库表
用了外键约束

选课表:
foreign key (选修.学号) references 学生表(学号)
foreign key (选修.课程号) references 课程表(课程号)
授课表:
foreign key (讲授.教师号) references 教师表(教师号)
foreign key (讲授.课程号) references 课程表(课程号)

Qt设计

大致思路

只设置了一种用户界面

成功
退出登陆
选择模态
选择模态
选择不同表
登陆界面-mainwindow
用户主界面-模态对话框
连接数据库
基本信息管理界面
选择课程界面
数据表
增删改查

登陆界面

在这里插入图片描述

void MainWindow::on_Login_Button_clicked()
{
    QString account = ui->account_Edit->text();
    QString pwd = ui->passwd_Edit->text();
    if(account.length() < 1 )
    {
        QMessageBox::warning(this, "错误", "请输入正确账号!!!");
    }
    else if(pwd.length() < 1 )
    {
        QMessageBox::warning(this, "错误", "请输入正确密码!!!");
    }
    else
    {
        if(account != adminAccount || pwd != adminpasswd)
        {
            QMessageBox::warning(this, "错误", "账号密码不正确!!!");
        }
        else
        {
//点击才会新建 管理界面
            home = new systemhome;
            home->setAttribute(Qt::WA_DeleteOnClose);
            home->setWindowTitle("管理界面");
            home->sqlconnect("courseInfo");

            this->hide();
            home->exec();
            this->show();

        }
    }

}

选择功能界面

在这里插入图片描述
搞得比较简陋,左边三个按钮出来的界面是一样的
在这里插入图片描述

连接数据库

	QSqlDatabase db;
	
	void systemhome::sqlconnect(const QString &dbName)
{
    db = QSqlDatabase::addDatabase("QMYSQL");
    //连接数据库
    db.setHostName("**.***.***.***");
    db.setUserName("****");
    db.setPassword("*****");
    db.setDatabaseName(dbName);

    //打开数据库
    if( !db.open())
    {
        QMessageBox::warning(this, "错误", db.lastError().text());
        return;
    }
    else
    {
        QMessageBox::information(this, "connect...", "连接成功", " OK ");
    }
}
  • 如果习惯于使用 SQL 语句,我们可以选择QSqlQuery类;如果只需要使用高层次的数据库接口(不关心 SQL 语法),我们可以选择使用QsqlTableModel类
  • 基于QSqlTableModel 的模型处理更为高级(骚操作多一点),如果对 SQL 语句不熟悉,并且不需要很多复杂的查询,这种QSqlTableModel模型基本可以满足一般的需求。

其中一个基本信息界面

void systemhome::on_S_Button_clicked()
{
     information *student = new information();
     student->setTableName("student");
     student->setWindowTitle("学生信息");
   //  student->setWindowIcon(QIcon(":/new/prefix1/infor.png"));
   //  this->hide();
     student->attributedName("学生编号", "姓名", "性别", "年龄", "班级");
     student->exec();
}

效果图
按钮自定义信号

void information::setTableName(QString tname)
{
    tablename = tname;
    //设置模型
    model = new QSqlTableModel();
    //使用哪个表
    model->setTable(tablename);
    //把modle放在view中
    ui->tableView->setModel(model);
    //显示model里的数据
    model->select();
    //设置model的编辑模式,手动提交修改
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    //ui->tableView->resizeColumnsToContents();   //每列宽度适配其内容
}

void information::attributedName(QString s1, QString s2, QString s3)
{
    //修改显示列表的名称
    model->setHeaderData(0, Qt::Horizontal, s1);
    model->setHeaderData(1, Qt::Horizontal, s2);
    model->setHeaderData(2, Qt::Horizontal, s3);
}

void information::on_AddButton_clicked()
{
    //添加空列
    QSqlRecord record = model->record();
    //获取行号
    int row = model->rowCount();
    model->insertRecord(row, record);
    ui->tableView->setEditTriggers(QAbstractItemView::AllEditTriggers);
}

void information::on_DelButton_clicked()
{
    //获取选中的模型
    QItemSelectionModel * sModel = ui->tableView->selectionModel();
    //取出模型中的索引
    QModelIndexList list = sModel->selectedRows();
    //删除所有选中的行
    for(int i = 0; i < list.size(); i++)
    {
        model->removeRow( list.at(i).row() );
    }
}

void information::on_AlterButton_clicked()
{
    ui->tableView->setEditTriggers(QAbstractItemView::AllEditTriggers);
}

void information::on_SureButton_clicked()
{
    //提交动作
    if(model->submitAll())
    {
        QMessageBox::information(this, "success", "干得漂亮!");
    }
    else{
        QMessageBox::warning(this, "error", "操作有点问题,检查合法性!");
        model->revertAll();
    }
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

void information::on_Cancel_Button_clicked()
{
    model->revertAll(); //取消所有动作
    model->submitAll();
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

void information::on_QueryButton_clicked()
{
    //获取行编辑内容
    QString id = ui->lineEdit->text();
    if(id.isEmpty())
    {
        model->setTable(tablename); //刷新表
        ui->tableView->setModel(model);

    }
    else
    {
        QString str = QString("id_No = '%1'").arg(id);
        model->setFilter(str);
    }
    model->select();
}

学生选课界面

在这里插入图片描述

/*ui界面中对话框问号问题
this->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint); //去除对话框问号按钮
或者可以监听按钮发生的事件作出响应
*/

void s_select::setTableName(QString tname1, QString tname2)
{
    tablename1 = tname1;
    tablename2 = tname2;
    model1 = new QSqlTableModel();
    model2 = new QSqlTableModel();
    model1->setTable(tablename1);
    model2->setTable(tablename2);

    model1->select();
    model2->select();
    
    //筛选课程号id,加入下拉框中
    if(model1->select())
    {
        for(int i = 0; i< model1->rowCount(); ++i)
        {
            QSqlRecord record = model1->record(i);
            //value()取出一个列的实际数据值
            QString str_c = record.value("C_No").toString();

            ui->c_comboBox->addItem(str_c);
        }
    }
    //筛选学生id,加入下拉框中
    if(model2->select())
    {
        for(int i = 0; i< model2->rowCount(); ++i)
        {
            QSqlRecord record = model2->record(i);
            QString str_s = record.value("id_No").toString();
            ui->s_comboBox->addItem(str_s);
        }
    }

}
void s_select::on_AddButton_clicked()
{
    QString ctext,stext;
    ctext = ui->c_comboBox->currentText();
    stext = ui->s_comboBox->currentText();
    double score;
    score = ui->doubleSpinBox->value();
    //qDebug() << ctext<<stext<<score;
    //用sql语法方式
    QString str = QString("insert into c_s(C_No, S_id, score) "
                          "values('%1', '%2', '%3')").arg(ctext).arg(stext).arg(score);

    if(query.exec(str)){
        QMessageBox::information(this, "success", "插入成功");
    }
    else {
        QMessageBox::critical(this, QObject::tr("Database Error"), query.lastError().text());
    }
    //刷新信息
    setTableName("c_s");

}

void s_select::on_DelButton_clicked()
{
    //获取选中的模型
    QItemSelectionModel * sModel = ui->tableView->selectionModel();
    //取出模型中的索引
    QModelIndexList list = sModel->selectedRows();
    if(list.isEmpty()){
        QMessageBox::warning(this, "注意", "未选中数据", " OK ");
        return;
    }
    //标准信息框 自定义按钮用法
//    QMessageBox question(QMessageBox::Question, "删除操作", "确认删除选中的元组吗?", QMessageBox::Yes|QMessageBox::No);
//    question.setButtonText(QMessageBox::Yes, " 确认 ");
//    question.setButtonText(QMessageBox::No, " 取消 ");
    //QMessageBox::StandardButton reply
    int reply = QMessageBox::question(this,"删除操作","确认删除选中的元组吗?", " 确认 ", " 取消 ");
    if(reply == QMessageBox::Yes)
    {
        model->removeRows(list.at(0).row(), list.size());
        model->submitAll();
    }
    else {
        model->revertAll();//取消所有动作
    }
}

void s_select::on_AlterButton_clicked()
{
    ui->tableView->setEditTriggers( QAbstractItemView::AllEditTriggers);
    ReadOnlyDelegate* readOnlyDelegate = new ReadOnlyDelegate();
    ui->tableView->setItemDelegateForColumn(0, readOnlyDelegate); //设置某列只读
    ui->tableView->setItemDelegateForColumn(1, readOnlyDelegate);
}

void s_select::on_AlterButton_2_clicked()
{
    int ret = QMessageBox::question(this,"修改操作","确认保存修改吗?"," 确认 ", " 取消 ");
    if(ret == QMessageBox::Yes)
    {
        model->submitAll();
    }
    else {
        model->revertAll();//取消所有动作
    }
}

老师授课表

在这里插入图片描述
在这里插入图片描述

类似学生授课表

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值