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

第三章 登陆界面

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

猜你喜欢

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