前面说到菜单模块,这次继续更新下面的内容
这是全部源代码和所需素材链接:
https://pan.baidu.com/s/1vJP4StgNYO27FH7HSjV_fg
源码链接
提取码:csdn
喜欢的朋友点赞加关注!!!
1.图书管理
图书管理主要功能有:显示所有图书信息,根据不同字段查询信息,新增图书,修改图书信息,删除图书信息。
1)查询信息显示在窗口主要是使用QT自带的模型QSqlQueryModel和视图QTableView。model->setHeaderData(0, Qt::Horizontal, tr(“列名”))可以设置显示出来字段名。setQuery()里存放查询语句。这个模型视图里的表内容不可更改。QSqlQuery myQuery(db)绑定了一个数据库对象。myQuery.exec(str_sql)也可以执行查询语句。如果查询结果不存在,提示用户重新输入条件。图书管理界面图见成果展示,具体代码如下:
QWidget* Dw = new QWidget();
QSqlQueryModel* model = new QSqlQueryModel(this);
QString str_sql = "select * from books where 书名 like '%" + book_name->text().trimmed() + "%' and 作者 like '%" + book_author->text().trimmed() + "%' and 出版社 like '%" + book_publisher->text().trimmed() + "%'";
if (book_name->text().trimmed()==""&& book_author->text().trimmed()==""&&book_publisher->text().trimmed()=="")
{
QMessageBox::information(this, "查询", "您没有输入查询条件,请重试");
return;
}
int count = 0;
QSqlQuery myQuery(db);
if (myQuery.exec(str_sql))
{
while (myQuery.next())//遍历数据表格每一行,从第0行到最后一行
{
count++;
}
}
if (count == 0) //如果查询的结果集为空,提示用户重新输入条件
{
QMessageBox::information(this, "", "没有您想要的查询,请重新输入查询信息");
return;
}
QSqlQueryModel* model = new QSqlQueryModel(this);
model->setQuery("select * from books");
model->setHeaderData(0, Qt::Horizontal, tr("图书ID"));
model->setHeaderData(1, Qt::Horizontal, tr("书名"));
model->setHeaderData(2, Qt::Horizontal, tr("作者"));
model->setHeaderData(3, Qt::Horizontal, tr("出版社"));
model->setHeaderData(4, Qt::Horizontal, tr("出版时间"));
model->setHeaderData(5, Qt::Horizontal, tr("价格"));
model->setHeaderData(6, Qt::Horizontal, tr("库存"));
this->tableView->setModel(model);//数据放置进去
this->tableView->verticalHeader()->hide();//不显示序号
this->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); //表的列宽均 匀充满空间
tableView->show();
2)更改和新增信息反映到数据库里主要用到QSqlTableModel模型和视图QTableView。QSqlRecord获取空记录。修改完以后可以点击确定提交和取消修改。提交事务会修改数据库里的内容,取消修改可撤销未提交的事务。达到了数据可视化的目标。参数均已初始化。具体代码如下:
QTableView* tableView;//表格模板
QSqlTableModel *model;//添加空记录
QSqlRecord record = model->record();//获取空记录
int row = model->rowCount();//获取行号
model->insertRecord(row, record);
void BookManagement::SureOk_clicked()
{
model->submitAll();//提交事务
QMessageBox::information(this, "修改", "修改成功!");
}
void BookManagement::Cancel_clicked()
{
model->revertAll(); //撤销事务
model->submitAll(); //撤销事务需要提交
}
3)删除信息需要使用QItemSelectionModel模型,获取选中的行,可以是多行。QModelIndexList可以取出选中的行,然后用for循环遍历删除每一行数据。具体代码如下:
void BookManagement::Deletebooks() //删除图书
{
//获取选中的模型
QItemSelectionModel* SModel = this->tableView->selectionModel()
//取出所选中的行
QModelIndexList list = SModel->selectedRows();
//删除
for (int i = 0;i < list.size();i++) //遍历选中的多行
{
model->removeRow(list.at(i).row()); //删除每一行
}
}
2.读者模块的功能和图书模块相似,都具有增删改查的功能,所以这里不多做介绍。页面如下:
3.借阅管理
借阅模块除了包含基本的增删改查外,还支持借书还书功能。借书时系统会自动显示所有图书信息。
1)借书模块:让用户输入姓名和图书编号完成借书。
○1防止用户乱点击借书而输入为空的情况,提示用户信息不全且终止下面的操作。
○2如果用户不是合法用户,终止借书操作。
○3如果书ID不存在,提醒用户重新输入ID。
○4如果借书本书超出上限,不允许借书。
○5如果书库存为0,不予借书。
○6以上条件都满足,对应书的库存-1,提示借书成功。
void BrReManagement::Borrow_clicked() //确定借书
{
//如果输入信息为空,则提示用户输入信息
if(borrow_reader_name->text().trimmed() == "" || book_id->text().trimmed() == "")
{
QMessageBox::information(this, "查询", "您没有输入的信息不全,请重新输入");
return;
}
//如果用户输入的姓名不存在,停止借书操作
int count = 0;
QSqlQuery myQuery(db);
QString str_sql = "select reader_id from readers where 姓名='" + borrow_reader_name->text().trimmed() + "'";
if (myQuery.exec(str_sql))
{
while (myQuery.next())//遍历结果集每一行,从第0行到最后一行
{
++count;
}
if (count == 0) //如果查询的读者不在结果集中,返回记录为空
{
QMessageBox::information(this, "", "抱歉,您不是合法用户!!!");
return;
}
}
//如果用户输入的图书ID不存在,停止借书操作
count = 0;
str_sql = "select book_id from books where book_id=" + book_id->text().trimmed();
if (myQuery.exec(str_sql))
{
while (myQuery.next())//遍历结果集每一行,从第0行到最后一行
{
++count;
}
if (count == 0) //如果图书ID不在结果集中,返回记录为空
{
QMessageBox::information(this, "", "图书ID不存在,请重新输入");
return;
}
}
//首先判断用户借书数量是否超出上限,超过则中断借书操作
//还书时间判空,如果为空表示未还书
count = 0;
str_sql = "select * from br_re \
where 还书时间 IS NULL and br_reader_id=(select reader_id from readers where 姓名='" + borrow_reader_name->text().trimmed() + "')";
if (myQuery.exec(str_sql))
{
while (myQuery.next())//遍历结果集每一行,从第0行到最后一行
{
++count; //累计借书记录数
}
}
if (count >= 5) //借书最多五本
{
QMessageBox::information(this, "", "您的借书数量超出上限,请先还书再借");
return;
}
//如果书的库存为0,系统提示无法借此书
str_sql = "select 库存 from books where book_id="+book_id->text().trimmed();
if (myQuery.exec(str_sql))
{
while (myQuery.next())//遍历结果集每一行,从第0行到最后一行
{
if (0 == myQuery.value(0)) {
QMessageBox::information(this, "", "抱歉,您想借的书库存不足");
return;
}
}
}
//根据姓名查找读者id,再将读者id和书的id增添到借阅记录中
str_sql = "insert into br_re(br_reader_id,br_book_id) \
select reader_id,book_id from readers,books \
where readers.姓名='" + borrow_reader_name->text().trimmed()+"' and
books.book_id=" + book_id->text().trimmed();
myQuery.exec(str_sql);
//借书后,相应的图书库存减1
str_sql = "update books set 库存=库存-1 where book_id=" + book_id->text().trimmed();
myQuery.exec(str_sql);
QMessageBox::information(this, "", "✔借书成功");
}
2)还书模块
还书时需要用户输入姓名,查询本人的借书情况,由用户选择还哪本书。输入借书记录ID完成还书。
○1如果查询未还图书结果为空,则提示用户没有未还的书。
○2还书后对应图书表图书库存加1。
void BrReManagement::SelectBorrowBooksList() //查询个人所借图书
{
//如果输入信息为空,则提示用户输入信息
if (return_reader_name->text().trimmed() == "")
{
QMessageBox::information(this, "查询", "您没有输入相关信息,请重新输入");
return;
}
//根据用户输入的名字找到其借书记录,而且是还书时间为空的记录
QSqlQueryModel* model = new QSqlQueryModel(this);
QString str_sql = "select br_id,reader_id,姓名,book_id,书名,借阅时间 \
from readers,books,br_re where \
br_reader_id=reader_id and br_book_id=book_id and \
还书时间 IS NULL and \
br_reader_id=(select reader_id from readers where 姓名='" + return_reader_name->text().trimmed() + "')";
int count = 0;
QSqlQuery myQuery(db);
if (myQuery.exec(str_sql))
{
while (myQuery.next())//遍历数据表格每一行,从第0行到最后一行
{
count++;
}
}
if (count == 0)
{
QMessageBox::information(this, "", "您没有未还的书或者信息输入错误");
return;
}
}
void BrReManagement::Return_clicked() //还书响应
{
//如果输入信息为空,则提示用户输入信息
if (return_br_id->text().trimmed() == "")
{
QMessageBox::information(this, "还书", "您没有输入相关信息,请重新输入");
return;
}
//用户还书后系统修改对应的还书时间为当前时间
//根据输入的借阅ID完成还书,因为借阅ID唯一
QSqlQuery myQuery(db);
QString str_sql = "update br_re set 还书时间=Now() where br_id=" + return_br_id->text().trimmed();
myQuery.exec(str_sql);
//根据用户输入的br_re id号,锁定对应的图书,使图书库存加1
str_sql = "update books,br_re set 库存=库存+1 where \
br_re.br_book_id=books.book_id and br_id="+ return_br_id->text().trimmed();
myQuery.exec(str_sql);
QMessageBox::information(this, "", "✔还书成功");
}
借书和还书界面如下:
4. QSS样式表(界面)
主要介绍系统用到的几种主要样式:
font-family 设置字体
background-image 设置背景图片
border-radius 设置圆角边框
font-size 设置字体大小
gridline-color 设置视图里表的边框颜色
margin-left 设置外边界的距离
background-color:qlineargradient 设置渐变色
*
{
font-family:Microsoft Yahei;
}
QLineEdit
{
border:1px solid blue;
border-radius:5px;
width:150px;
height:20px;
background-color:rgba(255,255,255,50%);
}
.SumW
{
background-image:url(:/LibraryMangamentSystem/book4.jpg);
}
.view
{
border-radius:55px;
background-color:rgba(0,0,0,30%);
}
.view:hover
{
border-radius:55px;
background-color:rgba(0,0,0,35%);
}
.Login
{
border:1px;
background-image:url(:/LibraryMangamentSystem/book6.jpg);
}
.Menu
{
background-image:url(:/LibraryMangamentSystem/book5.jpg);
}
.LoginLabel
{
font-size:20px;
color:white;
}
.logininput
{
font-size:20px;
border:1px;
border-radius:10px;
font-family:_GB2312 KaiTi_GB2312;
background-color:rgba(255,255,255,70%);
}
.logininput:hover
{
font-size:20px;
border:2px solid green;
border-radius:10px;
font-family:_GB2312 KaiTi_GB2312;
}
.Radiouser
{
margin-left:190px;
margin-top:130px;
}
.Radioadmin
{
margin-top:130px;
}
.MenuBtn
{
border-radius:10px;
background-color:rgba(0,0,0,30%);
font-family:_GB2312 KaiTi_GB2312;
}
.MenuBtn:hover
{
border-radius:10px;
font-family:_GB2312 KaiTi_GB2312;
background-color:qlineargradient(spread:pad, x1:0, x2:0, y1:0, y2:1,
stop : 0 rgba(150,255,0,10%),
stop : 0.495 rgba(88,207,253,100%),
stop : 0.505 rgba(88,207,253,100%),
stop : 1 rgba(150,255,0,10%));
}
.btn1
{
border-radius:10px;
border:2px solid green;
font-size:15px;
color:white;
}
.btn1:hover
{
border-radius:5px;
color:black;
background-color:green;
}
.RegisterBtn
{
border-radius:8px;
border:2px solid green;
}
.RegisterBtn:hover
{
border-radius:8px;
background-color:green;
}
.RegisterPage
{
background-color:black;
background-image:url(:/LibraryMangamentSystem/book11.jpg);
}
.QLineEditRegister
{
border:1px;
background-color:rgba(255,255,255,70%);
}
.tableview
{
background-color:rgba(255,255,255,60%);
border-radius:20px;
border:2px;
gridline-color:blue;
}
.SumLabel
{
color:white;
margin-left:60px;
}
.QHeaderView::section
{
background-color:rgba(255,255,255,0%);
}
.FunctionBtn
{
border-radius:8px;
background-color:rgba(255,255,255,50%);
font-family:_GB2312 KaiTi_GB2312;
height:50px;
margin-left:25px;
}
.SelectBtn
{
border:2px solid yellow;
border-radius:5px;
background-color:rgba(255,255,255,70%);
font-family:_GB2312 KaiTi_GB2312;
height:20px;
}
.SelectBtn:focus
{
border:2px solid yellow;
border-radius:5px;
background-color:rgba(255,255,255,50%);
font-family:_GB2312 KaiTi_GB2312;
height:20px;
background-color:qlineargradient(spread:pad, x1:0, x2:0, y1:0, y2:1,
stop : 0 rgba(150,255,0,10%),
stop : 0.495 rgba(88,207,253,100%),
stop : 0.505 rgba(88,207,253,100%),
stop : 1 rgba(150,255,0,10%));
}
.FunctionBtn:hover
{
border-radius:8px;
font-family:_GB2312 KaiTi_GB2312;
height:50px;
margin-left:25px;
background-color:qlineargradient(spread:pad, x1:0, x2:0, y1:0, y2:1,
stop : 0 rgba(180,159,218,90%),
stop : 0.495 rgba(238,162,162,100%),
stop : 0.505 rgba(238,162,162,100%),
stop : 1 rgba(180,159,218,90%));
}
.TransactionBtn
{
border-radius:8px;
background-color:rgba(255,255,255,50%);
}
.TransactionBtn:focus
{
border-radius:8px;
background-color:rgba(255,255,255,50%);
background-color:qlineargradient(spread:pad, x1:0, x2:0, y1:0, y2:1,
stop : 0 rgba(249,212,35,90%),
stop : 0.495 rgba(255,78,80,100%),
stop : 0.505 rgba(255,78,80,100%),
stop : 1 rgba(249,212,35,90%));
}
以上是我做的图书管理系统,仅供参考。