前言:本课程设计偏重于Qt,数据库设计方面比较简单
花费了一周多的时间学习Qt(B站的黑马程序员视频),边学边弄,遇到了许多问题也基本得到解决
问题知识小集,前辈大佬们的解决方法:
- 新版本Qt连接mysql缺少驱动
- mysql-connector-c 6.1.10下载,附有libmysql.lib
下载自己对应的版本,一般32位 - qt程序打包
- 打包发布出现driver not loaded driver not loaded,就是把之前的libmysql库拉到打包的文件中就可以
- QTableview设置某行某列不可编辑(只读,委托)
- Qt 标准对话框使用
- Qt 数据库错误捕捉与处理
- qt的编码格式要和数据库的文本格式一致比如utf-8,不然数据库表格内容会出错
数据库设计
用了外键约束
选课表:
foreign key (选修.学号) references 学生表(学号)
foreign key (选修.课程号) references 课程表(课程号)
授课表:
foreign key (讲授.教师号) references 教师表(教师号)
foreign key (讲授.课程号) references 课程表(课程号)
Qt设计
大致思路
只设置了一种用户界面
登陆界面
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();//取消所有动作
}
}
老师授课表
类似学生授课表