用Qt搭建图书管理系统(十一)

第十一章 删除书籍 

 

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();
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值