第十三章 删除用户
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();
}