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

第十三章 删除用户 

https://gitee.com/mayonaka/LibraryManageSystem

百度云:https://pan.baidu.com/s/1G95yPyGG080b6yXcjc8B0g

提取码:4q8b

删除用户的界面与删除书籍界面的实现类似,只是会有一点细节差异。

添加一个C++类,类名为DeleteUser,public继承于Form,在类的声明中添加Q_OBJECT宏,在deleteuser.cpp 中添加ui_form.h头文件。执行一下qmake。

类的声明:

类的属性:

    1.    user:储存所有用户的信息。

    2.    deleteUser:储存删除的用户的信息。

类的方法:

1.    ShowAllUsers:显示所有用户的信息,让用户选择要删除的对象。

2.    DeleteUserSlot:把用户选择要删除的用户添加到deleteUser链表中去。

3.    CloseEvent:拦截关闭事件,自定义一下在界面关闭时要处理的事务。

#include "form.h"
#include "user.h"

class DeleteUser : public Form
{
    Q_OBJECT
public:
    DeleteUser(User* node, User* node2);

    void ShowAllUsers();
    void closeEvent(QCloseEvent* e);

public slots:
    void DeleteUserSlot();

protected:
    User* user = NULL;
    User* deleteUser = NULL;
};

类的实现:

1.    在构造函数中,先设置一下窗口的标题,设置Tree Widget要显示几列信息,以及每一列的标题。然后初始化一下变量,最后连接一下信号与槽。

 

2.    ShowAllUsers:把所有的用户的信息转换成QTreeWidgtItem对象,插入到Tree Widget中,在每一行的第0项,设置一个复选框,让用户选择要删除的对象。

3.    closeEvent:拦截关闭信息,在界面关闭的时候,弹出一个对话框,询问用户是否保存操作,如果选择Save按钮,把deleteUser链表中的信息从user链表中删掉,同时也从数据库中删掉。如果选择Cancel按钮,只需清空deleteUser链表即可。

#include <QMessageBox>
#include "deleteuser.h"
#include "ui_form.h"

DeleteUser::DeleteUser(User *node, User *node2)
{
    this->setWindowTitle(QString::fromLocal8Bit("删除用户"));
    // 在Tree Widget上需要显示四列信息
    ui->treeWidget->setColumnCount(4);
    QStringList header;
    header << QString::fromLocal8Bit("书籍编号")
           << QString::fromLocal8Bit("书籍名称")
           << QString::fromLocal8Bit("书籍作者")
           << QString::fromLocal8Bit("书籍类型");
    ui->treeWidget->setHeaderLabels(header);

    this->user = node;
    this->deleteUser = node2;

    // 当用户点击确认按钮后,开始进行删除操作
    QObject::connect(ui->confirmPushButton, SIGNAL(clicked()),
                     this, SLOT(DeleteUserSlot()));
}

void DeleteUser::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链表中删掉
        UserType* node = (UserType*)this->deleteUser->GetNode(-1);
        node = (UserType*)node->GetNext();
        while (node != NULL)
        {
            this->user->DeleteNode(node->GetId());

            node = (UserType*)node->GetNext();
        }
        // 把删掉的书从数据库中删掉
        this->deleteUser->Save();
    } break;
    case QMessageBox::Cancel:
    {
        // 用户不保存删除操作
        this->deleteUser->Clear();
    } break;
    default:
        break;
    }
}

void DeleteUser::DeleteUserSlot()
{
    // 遍历Tree Widget的每一行,判断复选框是否被选中
    // 如果被选中,把它添加到deleteUser链表中,方便后续操作
    // 复选框要置回位选中状态
    for (int i = 0; i < ui->treeWidget->topLevelItemCount(); i++)
    {
        QTreeWidgetItem* item = ui->treeWidget->topLevelItem(i);
        if (item->checkState(0) == Qt::Checked)
        {
            UserType* node = new UserType();
            node->SetId(item->text(0).toInt());
            this->deleteUser->AddNode(node);

            item->setCheckState(0, Qt::Unchecked);
        }
    }

    this->close();
}

void DeleteUser::ShowAllUsers()
{
    if (this->user == NULL)
    {
        return;
    }

    // 循环user链表,把所有用户的信息显示在Tree Widget中
    // 每一行,在第0项会设置一个复选框
    UserType* node = (UserType*)this->user->GetNode(-1);
    node = (UserType*)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->GetPassword());
        item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable
                       | Qt::ItemIsUserCheckable);
        item->setCheckState(0, Qt::Unchecked);
        ui->treeWidget->insertTopLevelItem(0, item);

        node = (UserType*)node->GetNext();
    }
}
void AdminInterface::DeleteUserSlot()
{
    DeleteUser* w = new DeleteUser(this->user, this->deleteUser);
    // 设置当AddUser界面关闭后自动销毁
    // 界面销毁时会产生destroyed信号
    // 当管理员界面收到destroyed信号时,重新显示用户
    w->setAttribute(Qt::WA_DeleteOnClose);
    QObject::connect(w, SIGNAL(destroyed()), this, SLOT(ShowAllUsers()));
    w->show();
    w->ShowAllUsers();
}

猜你喜欢

转载自blog.csdn.net/hq_cjj/article/details/79516712