前文说道数据库基本操作,接下来第一步就是连接数据库
connect.h
#ifndef __CONNECT_H__ //常规写法,如果没有定义,则定义
#define __CONNECT_H__ //按照文件名写,前面两个__,后面两个__,中间_是代替.
//包含头文件 <>代表自带的头文件 ""代表自己做的.h文件
#include <QDebug> //qt中打印字符
#include <QSqlDatabase> //数据库连接的必要头文件
#include <QSqlQuery>
#include <QSqlError>
#include <QMessageBox>
#include "connectconfig.h"
/************************************************
* 函数名:connectDatabase()
* 参数:无
* 返回值:bool成功true,失败false
* 描述:数据库连接 本次连接通过ODBC连接MySQL数据库,返回值 0:成功 1:失败
************************************************/
bool connectDatabase()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setHostName(dataBaseIP);
db.setPort(dataBasePort);
db.setDatabaseName(dataBase); //上一章建立的数据库名字,我用的是仪器库预约系统
db.setUserName(dataBaseUser);//odbc中创建的用户
db.setPassword(dataBasePWD); //odbc中创建的密码
bool ok = db.open(); //判断数据库是否打开
if (ok)
{
QMessageBox::information(NULL, "提示", "数据库连接成功");
return true;
}
else
{
QMessageBox::information(NULL, "提示", "数据库连接失败");
qDebug()<<"error open database because"<<db.lastError().text();
return false;
}
}
#endif // CONNECT_H
电脑不支持MySQL驱动,所以改成了ODBC驱动,设置主机地址、端口号、数据库名字、用户名、密码等,其中QMessageBox是指平时见到的消息弹窗、常用到是information和warning
这里说明一下::指作用域,QMessageBox类作用域下的information函数,这里是c++的知识
按f2可快捷跳入头文件中,其中
第一个参数是指父窗口,常用null和this代替
第二个参数是指弹窗的标题文本内容
第三个参数是指弹窗里显示的文本内容
第四个参数是指弹窗的按钮 常用的是QMessageBox::Yes | QMessageBox::No,表示是和否两个选项
第五个参数是指默认选项指定按钮
如果想了解更多情况,可以在帮助里索引qmessage
dialog.c(登录)
#include "dialog.h"
#include "ui_dialog.h"
//定义三个全局变量
int index;//索引,用不同身份索引打开不同UI界面
QString UserName;//输入的用户名
QString UserID;
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
//去除边缘
setWindowFlags(Qt::FramelessWindowHint);
//setWindowFlags(Qt::FramelessWindowHint | windowFlags());
//背景透明
//setAttribute(Qt::WA_TranslucentBackground);
qDebug()<<"进入登录界面";
}
Dialog::~Dialog()
{
setAttribute(Qt::WA_DeleteOnClose);//设置属性,关闭的时候delete自己内存
qDebug()<<"退出登录界面";
delete ui;
}
void Dialog::on_pushButton_clicked()
{
qDebug()<<"登录中....";
//用用户id登录
QString userid;//输入的用户id
QString userpwd;//输入的用户密码
QString name;//数据库中的用户名
QString pwd;//数据库中的密码
QString identity;//用户身份
//获取用户输入的用户名
userid=ui->lineEdit->text();
//获取用户输入的用户密码
userpwd=ui->lineEdit_2->text();
//对数据库操作
QSqlQuery query;
//设置要执行的命令
query.prepare(QString("select name,pwd,identity from usertable where user_id = %1").arg(userid));
query.exec();
query.next();
//取出数据库中的内容
//user_id=query.value(0).toString();
name=query.value(0).toString();
pwd=query.value(1).toString();
identity=query.value(2).toString();
qDebug()<<userid<<name<<pwd<<identity;
if(!((pwd!=NULL)&&(pwd==userpwd)))
{
QMessageBox::information(NULL,"提示","用户名或密码错误");
qDebug()<<"登录失败...";
}
else
{
qDebug()<<"登录成功,判断身份...";
UserName=name;
UserID=userid;
qDebug()<<userid<<endl;
if(identity=="admin")
{
index=0;
}
else if(identity=="staff")
{
index=1;
}
else if(identity=="reviewer")
{
index=2;
}
accept();
}
}
本节是登录页面设计,用的是userid 登录,
先通过ui指针获取输入文本框的内容
执行数据库命令,将表中数据筛选出来
如果输入的userid能够在数据库里找到,将用户输入的密码与数据库密码比对,一样就说明登陆成功,如果找不到,说明用户不在数据库里,密码也是为空
登陆成功后,将名字和userID给全局变量,用来接下来的页面窗口标题设置以及该用户的相关操作,再判断身份信息是什么,给索引不同值;
main.c
#include "admin.h"
#include "staff.h"
#include "reviewer.h"
#include "connect.h"
#include "dialog.h"
#include <QApplication>
extern int index;
int main(int argc, char *argv[])
{
// qDebug()<<"available drivers:";
// QStringList drivers = QSqlDatabase::drivers();
// foreach(QString driver, drivers)
// qDebug()<<driver;
QApplication a(argc, argv);
Dialog login;
if(connectDatabase())
{
qDebug()<<"数据库连接成功";
if(login.exec() == QDialog::Accepted)
{
switch(index)
{
case 0:
{
Admin admin;
admin.show();
//继续加载
return a.exec();
}
break;
case 1:
{
Staff staff;
staff.show();
return a.exec();
}
break;
case 2:
{
Reviewer reviewer;
reviewer.show();
return a.exec();
}
break;
default:
break;
}
}
}
else
{
qDebug()<<"数据库连接失败";
}
return a.exec();
}
本文创建三个页面,管理员、审核员、普通员工三个界面,用登录界面的不同身份的索引进入不同界面。
admin.c 管理员
#include "admin.h"
#include "ui_admin.h"
Admin::Admin(QWidget *parent) :
QWidget(parent),
ui(new Ui::Admin)
{
ui->setupUi(this);
//设置模型,把二维表放入模型中
model=new QSqlTableModel(this);
model->setTable("usertable");
//设置窗口标题
QDateTime current_datetime=QDateTime::currentDateTime();
QString current_date=current_datetime.toString("yyyy.MM.dd hh:mm:ss.zzz");
setWindowTitle(QString("欢迎%1进入预约系统,现在是%2").arg(UserName).arg(current_date));
qDebug()<<"进入预约系统"<<endl;
}
Admin::~Admin()
{
setAttribute(Qt::WA_DeleteOnClose);
delete ui;
delete model;
}
/************************************************
* 函数名:Admin::on_pushButton_clicked()
* 参数:无
* 返回值:无
* 描述:查询用户信息按钮
************************************************/
void Admin::on_pushButton_clicked()
{
qDebug()<<"查询用户中..."<<endl;
//ui中显示
//设置手动提交
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//用控件tableview显示,把模型放在上面显示
ui->tableView->setModel(model);
model->select();//显示模型
//命令窗口显示,对数据库操作
QSqlQuery query;
QString user_id,name,pwd,identity;
//执行查询命令
query.exec("select * from usertable");
while(query.next())//判断是否全部显示
{
user_id=query.value(0).toString();
name=query.value(1).toString();
pwd=query.value(2).toString();
identity=query.value(3).toString();
qDebug()<<"user_id: "<<user_id
<<"name: "<<name
<<"pwd: "<<pwd
<<"identity: "<<identity;
}
}
/************************************************
* 函数名:Admin::on_pushButton_modifyUsertable_clicked()
* 参数:无
* 返回值:无
* 描述:修改用户信息,添加和删除也得点击
************************************************/
void Admin::on_pushButton_modifyUsertable_clicked()
{
qDebug()<<"修改用户信息中..."<<endl;
//开始事务操作
model->database().transaction();
if(model->submitAll())// 提交所有被修改的数据到数据库中
{
qDebug()<<"修改信息成功..."<<endl;
//提交
model->database().commit();//提交成功,事务将真正修改数据库数据
}
else {
//修改失败就数据库回滚操作
model->database().rollback();
//弹出警告框,表示错误原因
QMessageBox::warning(this,"数据库",QString("数据库错误:%1").arg(model->lastError().text()));
}
}
/************************************************
* 函数名:Admin::on_pushButton_delUser_clicked()
* 参数:无
* 返回值:无
* 描述:删除用户
************************************************/
void Admin::on_pushButton_delUser_clicked()
{
//删除整行就行
int userrow=ui->tableView->currentIndex().row();
if(userrow==-1)
{
QMessageBox::information(NULL,"取消预约","请选中删除行");
qDebug()<<"未选中行"<<endl;
return;
}
else
model->removeRow(userrow);
//删除行弹出警告框
int result=QMessageBox::warning(this,tr("删除当前行!"),tr("确定删除该用户?"),QMessageBox::Yes,QMessageBox::No);
if(result==QMessageBox::No)
{
//撤销操作
model->revertAll();
}
else {
//提交删除操作
model->submitAll();
}
}
/************************************************
* 函数名:Admin::on_pushButton_tooltable_clicked()
* 参数:无
* 返回值:无
* 描述:查询仪器库信息
************************************************/
void Admin::on_pushButton_tooltable_clicked()
{
qDebug()<<"正在查询仪器库信息..."<<endl;
//设置数据库模型
toolmodel=new QSqlTableModel(this);
//将仪器库模型与数据库中tooltable建立连接
toolmodel->setTable("tooltable");
//设置手动提交
toolmodel->setEditStrategy(QSqlTableModel::EditStrategy::OnManualSubmit);
//用控件tableview显示,把模型放在上面显示
ui->tableView->setModel(toolmodel);
// //设置仪器库模型显示
// toolmodel->select();
// toolmodel->database().transaction();
// if(model->submitAll())
// {
// qDebug()<<"修改余量成功..."<<endl;
// //提交
// model->database().commit();
// }
// else {
// //修改失败就数据库回滚操作
// model->database().rollback();
// //弹出警告框,表示错误原因
// QMessageBox::warning(this,"数据库",QString("数据库错误:%1").arg(model->lastError().text()));
// }
//设置仪器库模型显示
toolmodel->select();
//对数据库操作,执行显示仪器库数据库的命令
QSqlQuery query;
query.exec("select * from tooltable");
query.next();
int tool_id=query.value(0).toInt();
query.exec("select tool_index,tool_name,tool_num from tooltable where tool_id = ?");
query.addBindValue(tool_id);
while(query.next())//判断是否执行成功
{
//打印仪器库信息和最大容量
qDebug()<<"仪器编号:"<<query.value(0).toString()
<<"仪器名称:"<<query.value(1).toString()
<<"最大容量:"<<query.value(2).toInt()
<<endl;
}
}
/************************************************
* 函数名:Admin::on_pushButton_addUser_clicked()
* 参数:无
* 返回值:无
* 描述:添加用户
************************************************/
void Admin::on_pushButton_addUser_clicked()
{
qDebug()<<"添加用户..."<<endl;
//将UI界面中的ID,name,pwd文本框内容用变量接收
QString id=ui->lineEdit_id->text();
QString name=ui->lineEdit_name->text();
QString pwd=ui->lineEdit_pwd->text();
//判断添加用户信息是否填写正确
if(id==""||name==""||pwd=="")
{
QMessageBox::information(NULL,"添加用户","请输入完整的用户信息");
return;
}
else {
//判断用户ID长度是否符合
switch (identityID)
{
case 0: //判断员工ID
if(id.length()!=11)
{
QMessageBox::information(NULL,"添加用户","用户ID不正确,请输入11位长度的ID");
return;
}
break;
case 1://判断审核员ID
if(id.length()!=3)
{
QMessageBox::information(NULL,"添加用户","用户ID不正确,请输入3位长度的ID");
return;
}
break;
case 2://判断管理员ID
if(id.length()!=1)
{
QMessageBox::information(NULL,"添加用户","用户ID不正确,请输入1位长度的ID");
return;
}
break;
default:
break;
}
if(pwd.length()!=6)
{
QMessageBox::information(NULL,"添加用户","请输入6位长度的密码");
return;
}
}
//打印用户信息
qDebug()<<"id:"<<id
<<"name:"<<name
<<"pwd:"<<pwd
<<"identity:"<<identity;
//将用户信息添加到数据库中,先查询用户是否存在,存在就返回,不存在则添加进去
QSqlQuery query;
//判断用户是否存在
query.exec(QString("select name from usertable where user_id = %1").arg(id));
query.next();
// if(!query.next())
// {
// qDebug()<<"查询用户是否存在失败"<<endl;
// return;
// }
// else {
//将按ID筛选后的数据第一项--名字拿出来
QString nameflag=query.value(0).toString();
qDebug()<<"nameflag:"<<nameflag<<endl;
if(nameflag!="")
{
qDebug()<<"该用户已存在"<<endl;
QMessageBox::information(NULL,"添加用户","该用户已存在");
return;
}
else {
bool flag=query.exec(QString("insert into usertable values('%1','%2','%3','%4')").arg(id)
.arg(name).arg(pwd).arg(identity));
// QString str1 = QString("insert into user_info values('%1', '%2', '%3', '%4')").arg(id)
// .arg(name).arg(pwd).arg(identity);
// qDebug() << str1;
query.next();
// query.exec(str1);
if(!flag)
{
qDebug()<<"添加用户失败"<<endl;
return;
}
else{
qDebug()<<"添加用户成功"<<endl;
QMessageBox::information(NULL,"添加用户","添加用户成功");
//将UI界面清空
ui->lineEdit_id->setText("");
ui->lineEdit_name->setText("");
ui->lineEdit_pwd->setText("");
on_pushButton_clicked();
}
}
// }
}
/************************************************
* 函数名:Admin::on_pushButton_clearOrder_clicked()
* 参数:无
* 返回值:无
* 描述:清除预约信息
************************************************/
void Admin::on_pushButton_clearOrder_clicked()
{
qDebug()<<"清除预约信息..."<<endl;
int result=QMessageBox::warning(this,tr("清除预约信息"),tr("确定要清除预约信息?"),QMessageBox::Yes,QMessageBox::No);
if(result==QMessageBox::No)
{
qDebug()<<"已取消清除"<<endl;
}
else {
//用数据库命令代码清除表
qDebug()<<"Yes";
QSqlQuery query;
query.exec("delete from ordertable");
QMessageBox::information(NULL, "清空预约", "已清空预约!");
QSqlQuery queryRoom;
queryRoom.exec("update tooltable set tool_num = 20 where tool_id = 1");
queryRoom.exec("update tooltable set tool_num = 50 where tool_id = 2");
queryRoom.exec("update tooltable set tool_num = 100 where tool_id = 3");
}
}
/************************************************
* 函数名:Admin::on_comboBox_currentIndexChanged(int index)
* 参数:无
* 返回值:无
* 描述:身份下拉框选择
************************************************/
void Admin::on_comboBox_currentIndexChanged(int index)
{
//接收UI界面中的下拉框中的索引
index=ui->comboBox->currentIndex();
identityID=index;
//接收UI界面中的下拉框中的文字
switch (identityID) {
case 0:
identity="staff";
break;
case 1:
identity="reviewer";
break;
case 2:
identity="admin";
break;
default:
break;
}
//identity=ui->comboBox->currentText();
}
先创建数据库表模型,并设置为usertable(用户表),同时设置界面窗口标题以及时间
QDateTime::currentDateTime()
可获得当前时间,并将其转化为 yyyy.MM.dd hh:mm:ss.zzz格式
Admin::on_pushButton_clicked()
该函数为查询用户信息按钮
将刚刚的用户表模型放到UI界面中的tableview控件中显示,同时控制台打印输出观察用户信息
Qt中对数据库的操作主要通过QSqlQuery实现
query.exec("select * from usertable");
while(query.next())//判断是否全部显示
{
user_id=query.value(0).toString();
name=query.value(1).toString();
pwd=query.value(2).toString();
identity=query.value(3).toString();
qDebug()<<"user_id: "<<user_id
<<"name: "<<name
<<"pwd: "<<pwd
<<"identity: "<<identity;
该行表示执行数据库查询语句,并用next函数将结果往下执行,否则结果不显示,因为exec函数将结果查询出来后,结果是指向数据的前面,可用next或first将结果指向第一条数据,同时用value函数获得查询结果的值
Admin::on_pushButton_modifyUsertable_clicked()
该函数是修改用户信息
model->database().transaction();
if(model->submitAll())// 提交所有被修改的数据到数据库中
{
qDebug()<<"修改信息成功..."<<endl;
//提交
model->database().commit();//提交成功,事务将真正修改数据库数据
}
else {
//修改失败就数据库回滚操作
model->database().rollback();
//弹出警告框,表示错误原因
QMessageBox::warning(this,"数据库",QString("数据库错误:%1").arg(model->lastError().text()));
}
本函数是使用数据库的事物操作直接在模型上修改,首先开始事务操作,再判断将修改信息提交到数据库中这个操作是否成功,成功了事务将真正修改数据库数据,否则将进行数据库回滚操作,也就是返回之前结果、之前状态同时警告弹窗
删除用户
void Admin::on_pushButton_delUser_clicked()
{
//删除整行就行
int userrow=ui->tableView->currentIndex().row();
if(userrow==-1)
{
QMessageBox::information(NULL,"取消预约","请选中删除行");
qDebug()<<"未选中行"<<endl;
return;
}
else
model->removeRow(userrow);
//删除行弹出警告框
int result=QMessageBox::warning(this,tr("删除当前行!"),tr("确定删除该用户?"),QMessageBox::Yes,QMessageBox::No);
if(result==QMessageBox::No)
{
//撤销操作
model->revertAll();
}
else {
//提交删除操作
model->submitAll();
}
}
该函数是将用户删除,首先将通过UI指针的tableview控件获取当前位置的行,如果用户没有点击,该行数为-1,所以加以判断,如果获取到行数了,将删除该行,同时用警告窗口判断是否删除,如果是,就提交删除操作,如果否将回撤刚刚删除操作
查询仪器库操作
void Admin::on_pushButton_tooltable_clicked()
{
qDebug()<<"正在查询仪器库信息..."<<endl;
//设置数据库模型
toolmodel=new QSqlTableModel(this);
//将仪器库模型与数据库中tooltable建立连接
toolmodel->setTable("tooltable");
//设置手动提交
toolmodel->setEditStrategy(QSqlTableModel::EditStrategy::OnManualSubmit);
//用控件tableview显示,把模型放在上面显示
ui->tableView->setModel(toolmodel);
//设置仪器库模型显示
toolmodel->select();
//对数据库操作,执行显示仪器库数据库的命令
QSqlQuery query;
query.exec("select * from tooltable");
query.next();
int tool_id=query.value(0).toInt();
query.exec("select tool_index,tool_name,tool_num from tooltable where tool_id = ?");
query.addBindValue(tool_id);
while(query.next())//判断是否执行成功
{
//打印仪器库信息和最大容量
qDebug()<<"仪器编号:"<<query.value(0).toString()
<<"仪器名称:"<<query.value(1).toString()
<<"最大容量:"<<query.value(2).toInt()
<<endl;
}
}
该函数是查询仪器库信息,先创建一个模型将其设置为tooltable,并将其放在tableview中显示,
同时数据库命令操作查询仪器表,将其信息打印出来
添加用户
void Admin::on_pushButton_addUser_clicked()
{
qDebug()<<"添加用户..."<<endl;
//将UI界面中的ID,name,pwd文本框内容用变量接收
QString id=ui->lineEdit_id->text();
QString name=ui->lineEdit_name->text();
QString pwd=ui->lineEdit_pwd->text();
//判断添加用户信息是否填写正确
if(id==""||name==""||pwd=="")
{
QMessageBox::information(NULL,"添加用户","请输入完整的用户信息");
return;
}
else {
//判断用户ID长度是否符合
switch (identityID)
{
case 0: //判断员工ID
if(id.length()!=11)
{
QMessageBox::information(NULL,"添加用户","用户ID不正确,请输入11位长度的ID");
return;
}
break;
case 1://判断审核员ID
if(id.length()!=3)
{
QMessageBox::information(NULL,"添加用户","用户ID不正确,请输入3位长度的ID");
return;
}
break;
case 2://判断管理员ID
if(id.length()!=1)
{
QMessageBox::information(NULL,"添加用户","用户ID不正确,请输入1位长度的ID");
return;
}
break;
default:
break;
}
if(pwd.length()!=6)
{
QMessageBox::information(NULL,"添加用户","请输入6位长度的密码");
return;
}
}
//打印用户信息
qDebug()<<"id:"<<id
<<"name:"<<name
<<"pwd:"<<pwd
<<"identity:"<<identity;
//将用户信息添加到数据库中,先查询用户是否存在,存在就返回,不存在则添加进去
QSqlQuery query;
//判断用户是否存在
query.exec(QString("select name from usertable where user_id = %1").arg(id));
query.next();
// if(!query.next())
// {
// qDebug()<<"查询用户是否存在失败"<<endl;
// return;
// }
// else {
//将按ID筛选后的数据第一项--名字拿出来
QString nameflag=query.value(0).toString();
qDebug()<<"nameflag:"<<nameflag<<endl;
if(nameflag!="")
{
qDebug()<<"该用户已存在"<<endl;
QMessageBox::information(NULL,"添加用户","该用户已存在");
return;
}
else {
bool flag=query.exec(QString("insert into usertable values('%1','%2','%3','%4')").arg(id)
.arg(name).arg(pwd).arg(identity));
// QString str1 = QString("insert into user_info values('%1', '%2', '%3', '%4')").arg(id)
// .arg(name).arg(pwd).arg(identity);
// qDebug() << str1;
query.next();
// query.exec(str1);
if(!flag)
{
qDebug()<<"添加用户失败"<<endl;
return;
}
else{
qDebug()<<"添加用户成功"<<endl;
QMessageBox::information(NULL,"添加用户","添加用户成功");
//将UI界面清空
ui->lineEdit_id->setText("");
ui->lineEdit_name->setText("");
ui->lineEdit_pwd->setText("");
on_pushButton_clicked();
}
}
// }
}
该函数是添加用户
先获取UI界面中的id、name、pwd 三个信息文本框中的信息,如果有没有填的内容,就将弹出警告对话框,之后根据身份下拉框函数中的身份信息判断不同身份,使不同身份用户的用户id长度固定住,否则报错,同理还有密码。
再根据用户id查询用户表中是否有信息,有就说明该用户存在,不存在就将用户信息插入到用户表中,同时将UI中文本框信息清空
清除预约信息
void Admin::on_pushButton_clearOrder_clicked()
{
qDebug()<<"清除预约信息..."<<endl;
int result=QMessageBox::warning(this,tr("清除预约信息"),tr("确定要清除预约信息?"),QMessageBox::Yes,QMessageBox::No);
if(result==QMessageBox::No)
{
qDebug()<<"已取消清除"<<endl;
}
else {
//用数据库命令代码清除表
qDebug()<<"Yes";
QSqlQuery query;
query.exec("delete from ordertable");
QMessageBox::information(NULL, "清空预约", "已清空预约!");
QSqlQuery queryRoom;
queryRoom.exec("update tooltable set tool_num = 20 where tool_id = 1");
queryRoom.exec("update tooltable set tool_num = 50 where tool_id = 2");
queryRoom.exec("update tooltable set tool_num = 100 where tool_id = 3");
}
}
该函数用来清除所用预约信息,
点击按钮后,弹出对话框,判断是否删除,否就退出,是就执行数据库命令,删除预约表,同时将仪器表中仪器数量更新为原来的数量。
最后就是身份下拉框的函数,本槽函数用的是带索引参数的,事先在UI界面中将下拉框身份信息写好,这样每个身份信息都有不同的索引,按顺序排列的;所以函数内部接收该索引,并判断身份信息。
至此 管理员界面说明结束
审核员界面
显示预约信息
Reviewer::showOrdertable(int lookFlag)
该函数用来显示预约信息,并且用表格形式展示出来,重点是本节中需要用到外键形式,也是比较关键点,主要将预约表与各个表中数据建立连接,使得同步删除及更新。QSqlRelationalTableModel继承自QSqlTableModel,并且对其进行了扩展,提供了对外键的支持。一个外键就是一个表中的一个字段和其他表中的主键字段之间的一对一的映射。
void Reviewer::showOrdertable(int lookFlag)
{
//只读的QSqlQueryModel
// 操作单表的QSqlTableModel
//可以支持外键的QSqlRelationalTableModel
//设置模型数据表属性
QSqlRelationalTableModel *ordermodel;
ordermodel =new QSqlRelationalTableModel(this);
//属性变化时加载入数据库
ordermodel->setEditStrategy(QSqlTableModel::OnFieldChange);
ordermodel->setTable("ordertable");
//设置外键对应的内容 列 即是日期表的外键 数据库中的日期表 对应的主键 具体显示的内容即要显示的具体内容
ordermodel->setRelation(2,QSqlRelation("datetable","date_id","date_name"));
ordermodel->setRelation(3,QSqlRelation("timetable","time_id","time_name"));
ordermodel->setRelation(4,QSqlRelation("tooltable","tool_id","tool_name"));
ordermodel->setRelation(5,QSqlRelation("statetable","state_id","state_name"));
//设置显示的数据表表头
ordermodel->setHeaderData(0,Qt::Orientation::Horizontal,QObject::tr("预约ID"));
ordermodel->setHeaderData(1,Qt::Orientation::Horizontal,QObject::tr("用户ID"));
ordermodel->setHeaderData(2,Qt::Orientation::Horizontal,QObject::tr("日期"));
ordermodel->setHeaderData(3,Qt::Orientation::Horizontal,QObject::tr("时间"));
ordermodel->setHeaderData(4,Qt::Orientation::Horizontal,QObject::tr("仪器"));
ordermodel->setHeaderData(5,Qt::Orientation::Horizontal,QObject::tr("预约状态"));
//过滤器筛选
if(lookFlag!=0)
{
//筛选状态为1的
// ordermodel->setFilter(QObject::tr("state_id = %1").arg(1));
ordermodel->setFilter("relTblAl_5.state_id = 1");
}
//过滤完需要应用,重新加载
ordermodel->select();
//在UI界面里重新加载模型
ui->tableView->setModel(ordermodel);
//ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));
}
该函数先创建数据库关系表模型,并设置为预约表,并且设置属性为只要发生变化就加载进数据库
接下来就是设置模型中外键对应的内容,调用setrelation函数,将ordermodel模型中的第三个字段设为datetable中date_id的外键,date_id为主键,显示的是该表中date_name字段内容,同理依次创建 timetable tooltable statetable的外键,这样就使得预约表与其余表建立连接,并显示具体内容。
接着设置显示数据表模型中的表头,设置ordermodel模型中的第0个字段,为水平方向,内容是预约id,同理将其余设置好
本函数并且基于参数实现展示不同结果,主要是基于模型中的过滤器函数,文中显示的意思是过滤显示表中第六个字段中state_id为1的,这里我设置的是1是待审核状态;
过滤完需要应用,重新加载模型,并重新设置到tableview中。
审核预约
void Reviewer::on_pushButton_clicked()
{
//将数据库模型中的值传给参数
int currow=ui->tableView->currentIndex().row();
if(currow==-1)
{
QMessageBox::information(NULL,"审核预约","请选中审核行");
qDebug()<<"未选中行"<<endl;
return;
}
QAbstractItemModel *model=ui->tableView->model();
//将model中的所选行中第1列值传给user_id,用户id
QModelIndex index=model->index(currow,1);
QString user_id=model->data(index).toString();
//将model中的所选行中第2列值传给order_date,预约时间(星期)
index=model->index(currow,2);
QString order_date=model->data(index).toString();
//将model中的所选行中第3列值传给order_time,预约时间(上下午)
index=model->index(currow,3);
QString order_time=model->data(index).toString();
//将model中的所选行中第4列值传给order_tool,预约地点
index=model->index(currow,4);
QString order_tool=model->data(index).toString();
//将model中的所选行中第5列值传给order_state,预约状态
index=model->index(currow,5);
QString order_state=model->data(index).toString();
//将model中的所选行中第0列值传给order_id,预约ID
index=model->index(currow,0);
int order_id=model->data(index).toInt();
QSqlQuery query;
int date_id,time_id,tool_id;
//从日期表中找出预约时间是order_date的ID,判断是星期几
bool flag=query.exec(QString("select date_id from datetable where date_name=%1").arg(order_date));
query.next();
if(!flag)
{
qDebug()<<"预约日期表查询错误..."<<endl;
}
else {
date_id=query.value(0).toInt();
}
//从日期表中找出预约时间是order_time的ID,判断是上午还是下午
flag=query.exec(QString("select time_id from timetable where time_name=%1").arg(order_time));
query.next();
if(!flag)
{
qDebug()<<"预约时间表查询错误..."<<endl;
}
else {
time_id=query.value(0).toInt();
}
//从日期表中找出预约是order_room的ID,判断是哪一个仪器
flag=query.exec(QString("select tool_id from tooltable where tool_name = %1").arg(order_tool));
query.next();
if(!flag)
{
qDebug()<<"预约房间表查询错误..."<<endl;
}
else {
tool_id=query.value(0).toInt();
}
qDebug()<<order_id<<order_date<<order_time<<order_tool<<order_state;
//判断预约状态
if(order_state!="待审核")
{
QMessageBox::information(NULL,"预约状态","该记录为非待审核记录!");
return;
}
int result=QMessageBox::information(this,"审核预约","通过申请?",
QMessageBox::Yes,QMessageBox::No);
//判断是否通过预约申请,更新预约状态、仪器余量
//state_id :1待审核 2:通过 3:未通过
int state_id;
if(result==QMessageBox::No)
{
qDebug()<<"未通过申请"<<endl;
state_id=3;
UpdateOrderState(order_id,state_id);
UpdateToolMargin(date_id,time_id,tool_id);
}
else {
qDebug()<<"通过申请"<<endl;
state_id=2;
UpdateOrderState(order_id,state_id);
}
}
作为审核员最重要的就是审核预约功能
本函数首先先获取tableview中所点击的位置的行数,接着设置模型表示tableview中的模型,将该模型中的当前行的第0 列的索引的内容转换形式后取出来,和上文中创建预约表内容一样,上文是创建表头等,这节是将具体内容取出来,分别是预约id,用户id,预约日期(周几),预约时间(上下午),预约仪器名称,预约状态取出来
再根据时间表将预约日期对应的dateid拿出来,同理,timeID,toolid
判断刚刚预约状态是什么,如果不是待审核,弹出警告窗口,如果是,判断审核是否通过
通过:将更新预约表中的该预约id的预约状态为通过,即将stateID=2更新设置进预约表中,
不通过:更新预约表中的该预约id的预约状态为不通过,即将stateID=3更新设置进预约表中,在将余量增加,即根据不同dateid先找出是周几的表,在根据time_id判断是上午的量还是下午的量,最后根据toolid从日期表中将余量取出来,将余量+1后,在更新回该表里,
至此审核员界面说明结束