第十一章 删除书籍
https://gitee.com/mayonaka/LibraryManageSystem
百度云:https://pan.baidu.com/s/1G95yPyGG080b6yXcjc8B0g
提取码:4q8b
删除书籍界面的实现与还书界面的实现非常相似。
新建一个C++类,类名为DeleteBook,public继承自Form,在类声明中添加Q_OBJECT,在deletebook.cpp 中添加ui_form.h头文件,执行一下qmake重新构建一下makefile文件,否则qt会找不到文件。
类的声明:
类的属性:
1. book:储存所有的书的信息。
2. deleteBook:储存删除的书的信息。
类的方法:
1. ShowAllBooks:显示所有的书,让用户选择要删除的书。
2. DeleteBookSlot:进行删除书的操作。
3. closeEvent:拦截关闭事件,自定义界面关闭时要进行的操作。
#include "form.h"
#include "book.h"
class DeleteBook : public Form
{
Q_OBJECT
public:
DeleteBook(Book* node, Book* node2);
void ShowAllBooks();
public slots:
void DeleteBookSlot();
void closeEvent(QCloseEvent* e);
protected:
Book* book = NULL;
Book* deleteBook = NULL;
};
类的实现:
1. 先设置一下窗口的标题,Tree Widget的项数量,以及项名称。然后初始化一下变量。最后把信号与槽连接起来。
2. ShowAllBooks:遍历book链表,把每一个节点的信息转换成QTreeWidgetItem对象,插入Tree Widget中。每一行都要在第0项设置一个复选框,让用户可以进行选择操作。
3. DeleteBookSlot:遍历Tree Widget的每一行,检查每一行的复选框是否被选中,如果被选中,就把被选中的书添加进deleteBook链表,因为时删除操作,所以只要记录书的id就可以了。把书添加进deleteBook后还要把复选框置回未选中状态。
4. closeEvent:拦截关闭事件,提示用户是否保存操作,如果用户点击Save按钮,把删除的书从book链表中删掉,同样要在数据库中删掉。如果用户点击Cancel按钮,把deleteBook链表清空即可。
#include <QMessageBox>
#include "deletebook.h"
#include "ui_form.h"
DeleteBook::DeleteBook(Book *node, Book *node2)
{
this->setWindowTitle(QString::fromLocal8Bit("删除书籍"));
// 为Tree Widget设置有多少列,并设置每一列的名称
// 设置Tree Widget共四列
ui->treeWidget->setColumnCount(4);
QStringList header;
header << QString::fromLocal8Bit("书籍编号")
<< QString::fromLocal8Bit("书籍名称")
<< QString::fromLocal8Bit("书籍作者")
<< QString::fromLocal8Bit("书籍类型");
// 设置Tree Widget每一列的标题
ui->treeWidget->setHeaderLabels(header);
this->book = node;
this->deleteBook = node2;
QObject::connect(ui->confirmPushButton, SIGNAL(clicked()),
this, SLOT(DeleteBookSlot()));
}
void DeleteBook::ShowAllBooks()
{
if (this->book == NULL)
{
return;
}
// 遍历book链表
BookType* node = (BookType*)this->book->GetNode(-1);
node = (BookType*)node->GetNext();
while (node != NULL)
{
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0, QString::number(node->GetId()));
item->setText(1, node->GetName());
item->setText(2, node->GetAuthor());
item->setText(3, node->GetCategory());
// 设置第0项有复选框
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable
| Qt::ItemIsUserCheckable);
item->setCheckState(0, Qt::Unchecked);
ui->treeWidget->insertTopLevelItem(0, item);
node = (BookType*)node->GetNext();
}
}
void DeleteBook::closeEvent(QCloseEvent *e)
{
// 弹出对话框,询问是否保存
QMessageBox::StandardButton msg = QMessageBox::information(this,
tr("Prompt"),
tr("Save You Book?"),
QMessageBox::Save,
QMessageBox::Cancel);
switch (msg)
{
case QMessageBox::Save:
{
// 把删掉的书从book链表中删掉
BookType* node = (BookType*)this->deleteBook->GetNode(-1);
node = (BookType*)node->GetNext();
while (node != NULL)
{
this->book->DeleteNode(node->GetId());
node = (BookType*)node->GetNext();
}
// 把删掉的书从数据库中删掉
this->deleteBook->Save();
} break;
case QMessageBox::Cancel:
{
// 用户不保存删除操作
this->deleteBook->Clear();
} break;
default:
break;
}
}
void DeleteBook::DeleteBookSlot()
{
// 遍历Tree Widget查看每一行的复选框是否被选中
// 选中了则添加进deleteBook链表
// 删除书籍只需要记录书的id
for (int i = 0; i < ui->treeWidget->topLevelItemCount(); i++)
{
QTreeWidgetItem* item = ui->treeWidget->topLevelItem(i);
if (item->checkState(0) == Qt::Checked)
{
BookType* node = new BookType();
node->SetId(item->text(0).toInt());
this->deleteBook->AddNode(node);
// 把复选框置回未选中状态
item->setCheckState(0, Qt::Unchecked);
}
}
this->close();
}