第十二章 添加用户
https://gitee.com/mayonaka/LibraryManageSystem
百度云:https://pan.baidu.com/s/1G95yPyGG080b6yXcjc8B0g
提取码:4q8b
添加用户的界面可以是和添加书籍的界面基本类似,只是有一点实现细节不同。
添加一个Qt设计师界面类,界面模板选择Widget,类名改为AddUser。
添加用户界面共有三个Label作为提示信息,三个LineEdit用于接受用户收入,两个Push Button。
1. Label:显示文字:“用户编号”,变量名:未用到,可不改。
2. Label:显示文字:“用户名”, 变量名:未用到,可不改。
3. Label:显示文字:“用户密码”, 变量名:未用到,可不改。
4. LineEdit:显示文字:无,变量名:idLineEdit。
5. LineEdit:显示文字:无,变量名:nameLineEdit。
6. LineEdit:显示文字:无,变量名:passwordLineEdit。
7. Push Button:显示文字:“确定”,变量名:confirmPushButton。
8. Push Button:显示文字,“取消“,变量名:cancelPushButton。
类的声明:
类的属性:
1. user:储存所有有用户的信息。
2. addUser:储存添加的用户的信息。
类的方法:
1. AddUserSlot:添加用户的槽函数,当用户点击确定按钮后,进入此函数,处理添加用户的具体操作。
2. closeEvent:拦截关闭事件,自定义界面关闭时要处理的事务。
#include <QWidget>
#include "user.h"
namespace Ui {
class AddUser;
}
class AddUser : public QWidget
{
Q_OBJECT
public:
explicit AddUser(User* node, User* node2, QWidget *parent = 0);
~AddUser();
void closeEvent(QCloseEvent* e);
public slots:
void AddUserSlot();
protected:
User* user = NULL;
User* addUser = NULL;
private:
Ui::AddUser *ui;
};
类的实现:
1. 先设置一下窗口标题,然后初始化变量,最后连接一下信号与槽。
2. AddUserSlot:先判断是否输入了信息,没有就退出,如果输入了信息,把输入的信息转换成UserType对象,添加到addUser链表中去。
3. closeEvent:弹出对话框,询问用户是否保存操作,如果用户选择Save,把addUser链表中的信息添加到user链表中去,同时也把它们保存到数据库中去。如果用户选择Cancel,清空addUser链表即可。
如果出现错误:
admininterface.obj : error LNK2019: 无法解析的外部符号 "public:__cdecl AddUser::AddUser(class User *,class User *,class QWidget *)"(??0AddUser@@QEAA@PEAVUser@@0PEAVQWidget@@@Z),该符号在函数"public: void __cdecl AdminInterface::AddUserSlot(void)"(?AddUserSlot@AdminInterface@@QEAAXXZ) 中被引用
debug\LibraryManageSystem.exe : fatalerror LNK1120: 1 个无法解析的外部命令。
执行一下qmake就行了。
#include <QMessageBox>
#include "adduser.h"
#include "ui_adduser.h"
AddUser::AddUser(User *node, User *node2, QWidget *parent) :
QWidget(parent),
ui(new Ui::AddUser)
{
ui->setupUi(this);
this->setWindowTitle(QString::fromLocal8Bit("添加用户"));
this->user = node;
this->addUser = node2;
QObject::connect(ui->confirmPushButton, SIGNAL(clicked()),
this, SLOT(AddUserSlot()));
QObject::connect(ui->cancelPushButton, SIGNAL(clicked()),
this, SLOT(close()));
}
AddUser::~AddUser()
{
delete ui;
}
void AddUser::closeEvent(QCloseEvent *e)
{
// 弹出对话框,询问是否保存
QMessageBox::StandardButton msg = QMessageBox::information(this,
tr("Prompt"),
tr("Save You Operation?"),
QMessageBox::Save,
QMessageBox::Cancel);
switch (msg)
{
case QMessageBox::Save:
{
// 把添加的用户添加到user中
UserType* node = (UserType*)this->addUser->GetNode(-1);
node = (UserType*)node->GetNext();
while (node != NULL)
{
UserType* node2 = new UserType();
node2->SetId(node->GetId());
node2->SetName(node->GetName());
node2->SetPassword(node->GetPassword());
this->user->AddNode(node2);
node = (UserType*)node->GetNext();
}
// 把添加的用户保存到数据库中
this->addUser->Save();
} break;
case QMessageBox::Cancel:
{
// 清空添加的用户
this->addUser->Clear();
} break;
default:
break;
}
}
void AddUser::AddUserSlot()
{
// 没有填写信息就退出
// 这里只检查了是否填写了id
if (ui->idLineEdit->text().isEmpty())
{
return;
}
UserType* node = new UserType();
node->SetId(ui->idLineEdit->text().toInt());
node->SetName(ui->nameLineEdit->text());
node->SetPassword(ui->passwordLineEdit->text());
this->addUser->AddNode(node);
this->close();
}
void AdminInterface::AddUserSlot()
{
AddUser* w = new AddUser(this->user, this->addUser);
// 设置当AddUser界面关闭后自动销毁
// 界面销毁时会产生destroyed信号
// 当管理员界面收到destroyed信号时,重新显示用户
w->setAttribute(Qt::WA_DeleteOnClose);
QObject::connect(w, SIGNAL(destroyed()), this, SLOT(ShowAllUsers()));
w->show();
}