第三章 登陆界面
https://gitee.com/mayonaka/LibraryManageSystem
百度云:https://pan.baidu.com/s/1G95yPyGG080b6yXcjc8B0g
提取码:4q8b
现在,项目所需要的数据结构已经介绍完了,可以开始搭建图书管理系统的图形界面了,先从登陆界面开始。
1. 首先,新建一个项目,选择Qt Widgets Application项目,名称改为LibraryManageSystem,点下一步,再点下一步,基类选QWidget,类名改为Login。(注意路径和项目名不要出现空格和中文,如果添加一个文件后,编译报错,可以先清理项目,重新构建项目,执行qmake试试)。
2. 双击项目Forms文件夹下的login.ui文件,设计登陆界面。Qt为我们提供了许多方便的控件,直接使用就行了,Login界面使用了两个label,两个lineEdit,两个pushButton。控件上显示的文字只要双击控件就能更改,控件的变量名通过右击控件,选择改变对象名称来修改。下面给出login界面的控件显示文字和控件的变量名。
1. Label:显示文字:“用户名”,变量名:在程序中没有用到,可不修改。
2. Label:显示文字:“密码”,变量名:在程序中没有用到,可不修改
3. Line Edit:显示文字:无,变量名:nameLineEdit。
4. Line Edit:显示文字:无,变量名:passwordLineEdit。
5. Push Button:显示文字:“登陆”,变量名:loginPushButton。
6. Push Button:显示文字:“退出”,变量名:closePushButton。
3. Login类的实现并不复杂,首先做一下初始化操作,再添加一个槽函数,实现用户点击登陆按钮后的登陆操作就行了。先给大家简单介绍信号与槽,大家只要简单了解一下就会使用了(具体的原理请看专业书籍,这里只讲应用)。以一个按钮为例,用户单击这个按钮后,会发出一个clicked信号,这时可以设置一个函数来接受这个信号,进行一些操作,这个接受的函数就叫槽,信号与槽通过connect函数来告诉系统把信号和槽连接起来
下面来介绍Login类的实现细节:
1. 在构造函数里先初始化user变量,把两个按钮的信号与相应的槽连接起来
2. LoginSystemSlot槽函数是自定义的槽,主要用来实现登陆过程,在函数中先获得用户输入的用户名和密码,然后与数据库中的信息一个一个进行比较,如果相等,再判断用户名是否为管理员,是管理员则进入管理员界面,是用户则进入用户界面,如果数据库中所有信息都比较完后,还没有相等的,表明用户输入错误,这时要提示用户输入错误。
3. 因为这里要用到用户界面和管理界面,我们先再这里把两个界面建立出来,具体的实现,后面章节再讲。
右击项目,添加新文件,选择Qt设计界面类,界面模板选择Widget,类名改为UserInterface;同样方法再建一个AdminInterface。把两个类的头文件包含进login.cpp 文件中
4. 判断用户输入正确后,就建立相应的界面,并把它显示出来。例如:如用用户名是管理员,AdminInterface*w = new AdminInterface(); w->show();,注意一定要调用show函数,否则界面不显示。
5. 如果编译时报错:login.obj: error LNK2019: 无法解析的外部符号……,可以尝试点构建->清理所有项目->重新构建所有项目->执行qmake。如果程序没错,就可以运行了。
#include <QWidget>
#include "user.h"
namespace Ui {
class Login;
}
class Login : public QWidget
{
Q_OBJECT
public:
explicit Login(QWidget *parent = 0);
~Login();
public slots:
// loginPushButton发出clicked信号时,触发这个函数
// 判断输入的用户名与密码是否匹配
// 如果用户名与密码正确,打开用户界面(用户名是用户)
// ,或管理员界面(用户名是管理员)
// 如果用户名或密码错误,提示用户输入错误
// 调用此函数之前要初始化user变量
void LoginSystemSlot();
private:
Ui::Login *ui;
// 用来储存数据库中所有的用户信息
// 登陆系统时,用来判断用户的输入是否正确
User* user = NULL;
};
#include <QMEssageBox>
#include <qDebug>
#include "login.h"
#include "ui_login.h"
#include "userinterface.h"
#include "admininterface.h"
Login::Login(QWidget *parent) :
QWidget(parent),
ui(new Ui::Login)
{
ui->setupUi(this);
// 设置界面的标题
this->setWindowTitle(QString::fromLocal8Bit("登陆"));
// 初始化所用用户的信息
this->user = new User();
this->user->Init();
// 把确定按钮与LoginSystemSlot槽连接,
// 用户点击确定按钮后,会执行LoginSystemSlot函数
QObject::connect(ui->loginPushButton, SIGNAL(clicked()), this,
SLOT(LoginSystemSlot()));
// 把退出按钮与close槽连接,
// 用户点击退出按钮后,会执行close函数(close是系统提供的槽),关闭界面
QObject::connect(ui->closePushButton, SIGNAL(clicked()), this,
SLOT(close()));
}
Login::~Login()
{
delete ui;
if (this->user != NULL)
{
delete this->user;
this->user = NULL;
}
}
void Login::LoginSystemSlot()
{
// 获得nameLineEdit的值
QString name = ui->nameLineEdit->text();
// 获得passwordLineEdit的值
QString password = ui->passwordLineEdit->text();
// 获得链表的头节点
UserType* node = (UserType*)this->user->GetNode(-1);
// 获得链表的第一个节点
node = (UserType*)node->GetNext();
// 遍历整个链表
while (node != NULL)
{
// 判断用户输入是否正确
if (node->GetName() == name && node->GetPassword() == password)
{
if (name == "root")
{
AdminInterface* w = new AdminInterface();
w->show();
}
else
{
UserInterface* w = new UserInterface();
w->show();
}
// 登陆成功后关闭登陆界面
this->close();
return;
}
node = (UserType*)node->GetNext();
}
// 如果链表中没有用户输入的用户名和密码,表示输入错误
QMessageBox::information(this, "Error Message", "Login Error, Name Or Password Error");
}