PyQT5一起学做图书管理系统(4)登陆页面

登陆页面

环境

系统:windows10系统
编辑器:Sublime3
编程语言:python3+pyqt5

前言

本节登陆页面和注册页面有点类似,还是那句话哈,记得把数据库文件的代码先做好。

登陆页面逻辑

界面显示,两个输入框,两个按钮就可以了。
逻辑方面,限制输入框长度,输入内容类型限制,密码输入之后不可见,
点击登陆之后,对比数据库,账号不存在重新输入,密码错误重新输入,完全一致才成功登陆

界面应该如下图所示,也可以参照qq登陆界面设计

界面设计

对于界面设计,可以使用QTCreator通过拖拽的方式来实现,然后再转换为python代码
也可以全部直接写代码来实现,本文中全部是代码方式。
UI界面很简洁:

正中间一个Lable输入标识
2个Lable,2个输入框来输入登陆信息
2个按钮

 def setUpUI(self):
        self.Vlayout = QVBoxLayout(self)
        self.Hlayout1 = QHBoxLayout()
        self.Hlayout2 = QHBoxLayout()
        self.formlayout = QFormLayout()

        

        self.label1 = QLabel("账 号 : ")
        labelFont = QFont()
        labelFont.setPixelSize(18)
        lineEditFont = QFont()
        lineEditFont.setPixelSize(16)
        self.label1.setFont(labelFont)
        self.lineEdit1 = QLineEdit()
        self.lineEdit1.setFixedHeight(32)
        self.lineEdit1.setFixedWidth(180)
        self.lineEdit1.setFont(lineEditFont)
        self.lineEdit1.setMaxLength(10)

        self.formlayout.addRow(self.label1, self.lineEdit1)

        self.label2 = QLabel("密 码 : ")
        self.label2.setFont(labelFont)
        self.lineEdit2 = QLineEdit()
        self.lineEdit2.setFixedHeight(32)
        self.lineEdit2.setFixedWidth(180)
        self.lineEdit2.setMaxLength(16)

        # 设置验证
        reg = QRegExp("PB[0~9]{8}")
        pValidator = QRegExpValidator(self)
        pValidator.setRegExp(reg)
        self.lineEdit1.setValidator(pValidator)

        reg = QRegExp("[a-zA-z0-9]+$")
        pValidator.setRegExp(reg)
        self.lineEdit2.setValidator(pValidator)

        passwordFont = QFont()
        passwordFont.setPixelSize(16)
        self.lineEdit2.setFont(passwordFont)

        self.lineEdit2.setEchoMode(QLineEdit.Password)  #输入后就显示为星号
        self.lineEdit2.setEchoMode(QLineEdit.PasswordEchoOnEdit) #输入时为字符,失去焦点为星号
        self.formlayout.addRow(self.label2, self.lineEdit2)


        self.signIn = QPushButton("登 录")
        self.signIn.setFixedWidth(70)
        self.signIn.setFixedHeight(30)
        self.signIn.setFont(labelFont)

        self.signCancle = QPushButton("重 置")
        self.signCancle.setFixedWidth(70)
        self.signCancle.setFixedHeight(30)
        self.signCancle.setFont(labelFont)
        #self.signCancle.setStyleSheet('background-color: #505F69;border: 1px solid #32414B;color: #F0F0F0;border-radius: 4px;padding: 3px;outline: none;')

        self.testlayout=QHBoxLayout()
        self.testlayout.addWidget(self.signIn)
        self.testlayout.addWidget(self.signCancle)
        self.testwidget = QWidget()
        self.testwidget.setLayout(self.testlayout)
        self.formlayout.addRow('',self.testwidget)
        

        self.label = QLabel("欢迎使用图书馆管理系统")
        fontlabel = QFont()
        fontlabel.setPixelSize(30)
        self.label.setFixedWidth(390)
        #pixmap=QPixmap('index.jpg').scaled(self.label.width(), self.label.height())
        #self.label.setPixmap(pixmap)
        #self.label.setStyleSheet("QLabel{background-image:url(index.jpg)}") 
        # self.label.setFixedHeight(80)             #不设置宽度了
        self.label.setFont(fontlabel)
        self.Hlayout1.addWidget(self.label, Qt.AlignCenter)
        self.widget1 = QWidget()
        self.widget1.setLayout(self.Hlayout1)
        self.widget2 = QWidget()
        self.widget2.setFixedWidth(300)
        self.widget2.setFixedHeight(150)
        self.widget2.setLayout(self.formlayout)
        
        self.Hlayout2.addWidget(self.widget2, Qt.AlignCenter)
        self.widget = QWidget()
        self.widget.setLayout(self.Hlayout2)
        
        #background-image,当背景图片宽度高度小于窗口的宽度高度时,则会加载多个背景图片 
        #background-image,当背景图片的宽度高度大于窗口的宽度高度时,背景图片会平铺整个背景
       # self.widget1.setStyleSheet("QWidget{background-image:url(index.jpg);}")     #设置背景图片
        self.widget.setStyleSheet("QWidget{border-image:url(index.jpg)}")          # 使用border-image会自适应完全填充这个控件
        #self.widget1.setStyleSheet("color:green")                                  #设置字体颜色
        #self.widget1.setStyleSheet("color:red;background:yellow")                  #设置字体颜色和背景颜色
        self.Vlayout.addWidget(self.widget1)
        self.Vlayout.addWidget(self.widget, Qt.AlignTop)

初始化程序

初始化UI界面和数据库文件

   def __init__(self):
        super(SignInWidget, self).__init__()
        self.resize(900, 600)
        self.setWindowTitle("欢迎使用图书馆管理系统")
        self.setUpUI()
        self.userdb=UserDbManager()

注册事件

首先是将注册信号和注册函数进行绑定,这部分是再UI设计中

        self.signIn.clicked.connect(self.signInCheck)
        self.signCancle.clicked.connect(self.signInCancleReset)
        self.lineEdit2.returnPressed.connect(self.signInCheck)
        self.lineEdit1.returnPressed.connect(self.signInCheck)

然后来看重置功能:
重置功能,就是把输入内容删除,所以直接调用lineEdit控件的clear()功能就好了

    def signInCancleReset(self):
        self.lineEdit1.clear()  
        self.lineEdit2.clear() 

注册功能:

1.什么都没输入,直接点击登陆按钮,就弹出告警信息直接返回
2.当前账号没有注册,弹出告警信息,然后重置输入框
3.一切信息正确,根据账号ID判断是否为管理员,然后发送不同的信号,登陆进入不同的窗口

def signInCheck(self):
        studentId = self.lineEdit1.text()
        password = self.lineEdit2.text()
        if (studentId == "" or password == ""):
            print(QMessageBox.warning(self, "警告", "学号和密码不可为空!", QMessageBox.Yes, QMessageBox.Yes))
            return

        hl = hashlib.md5()                                              #md5加密对象
        hl.update(password.encode(encoding='utf-8'))                    # 将密码更新为MD5加密对象

        userdata=self.userdb.querybyUserid(studentId)
        if (not userdata):
            #QMessageBox.information()返回值是一个整形变量,是点击按钮所代表的值
            # QMessageBox.Yes       =   16384
            # QMessageBox.No        =   65536
            # QMessageBox.Close     =   2097152
            # QMessageBox.Abort     =   262144
            # QMessageBox.Help     =   16777216
            print(QMessageBox.information(self, "提示", "该账号不存在,请重新输入!", QMessageBox.Yes))     
            self.signInCancleReset()
        else:
            #将输入的密码经过MD5加密之后,重新跟数据库中的值对比
            print( userdata[0][0] )
            print( userdata[0][1] )
            print( userdata[0][2] )
            print( userdata[0][3] )
            print( userdata[0][4] )
            if (studentId == userdata[0][0] and hl.hexdigest() == userdata[0][2]):     
                # 如果是管理员, 再在数据库中,第三项代表是否是管理员,1为管理员,0不是
                if (userdata[0][3]==1):
                    self.is_admin_signal.emit()
                else:
                    self.is_student_signal.emit(studentId)
            else:
                print(QMessageBox.information(self, "提示", "密码错误!", QMessageBox.Yes, QMessageBox.Yes))
        return

同样的本次代码可以单独改造一下适用于其他项目

完整的代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2018-12-05 21:36:26
# @Author  : Jimy_Fengqi (jmps515@163.com)
# @Link    : https://blog.csdn.net/qiqiyingse/
# @Version : $Id$

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import qdarkstyle
import hashlib
from PyQt5.QtSql import *
from db.userInfoManager import UserDbManager
import images
class SignInWidget(QWidget):
    is_admin_signal = pyqtSignal()
    is_student_signal = pyqtSignal(str)

    def __init__(self):
        super(SignInWidget, self).__init__()
        self.resize(900, 600)
        self.setWindowTitle("欢迎使用图书馆管理系统")
        self.setUpUI()
        self.userdb=UserDbManager()

    def setUpUI(self):
        self.Vlayout = QVBoxLayout(self)
        self.Hlayout1 = QHBoxLayout()
        self.Hlayout2 = QHBoxLayout()
        self.formlayout = QFormLayout()

        

        self.label1 = QLabel("账 号 : ")
        labelFont = QFont()
        labelFont.setPixelSize(18)
        lineEditFont = QFont()
        lineEditFont.setPixelSize(16)
        self.label1.setFont(labelFont)
        self.lineEdit1 = QLineEdit()
        self.lineEdit1.setFixedHeight(32)
        self.lineEdit1.setFixedWidth(180)
        self.lineEdit1.setFont(lineEditFont)
        self.lineEdit1.setMaxLength(10)

        self.formlayout.addRow(self.label1, self.lineEdit1)

        self.label2 = QLabel("密 码 : ")
        self.label2.setFont(labelFont)
        self.lineEdit2 = QLineEdit()
        self.lineEdit2.setFixedHeight(32)
        self.lineEdit2.setFixedWidth(180)
        self.lineEdit2.setMaxLength(16)

        # 设置验证
        reg = QRegExp("PB[0~9]{8}")
        pValidator = QRegExpValidator(self)
        pValidator.setRegExp(reg)
        self.lineEdit1.setValidator(pValidator)

        reg = QRegExp("[a-zA-z0-9]+$")
        pValidator.setRegExp(reg)
        self.lineEdit2.setValidator(pValidator)

        passwordFont = QFont()
        passwordFont.setPixelSize(16)
        self.lineEdit2.setFont(passwordFont)

        self.lineEdit2.setEchoMode(QLineEdit.Password)  #输入后就显示为星号
        self.lineEdit2.setEchoMode(QLineEdit.PasswordEchoOnEdit) #输入时为字符,失去焦点为星号
        self.formlayout.addRow(self.label2, self.lineEdit2)


        self.signIn = QPushButton("登 录")
        self.signIn.setFixedWidth(70)
        self.signIn.setFixedHeight(30)
        self.signIn.setFont(labelFont)

        self.signCancle = QPushButton("重 置")
        self.signCancle.setFixedWidth(70)
        self.signCancle.setFixedHeight(30)
        self.signCancle.setFont(labelFont)
        #self.signCancle.setStyleSheet('background-color: #505F69;border: 1px solid #32414B;color: #F0F0F0;border-radius: 4px;padding: 3px;outline: none;')

        self.testlayout=QHBoxLayout()
        self.testlayout.addWidget(self.signIn)
        self.testlayout.addWidget(self.signCancle)
        self.testwidget = QWidget()
        self.testwidget.setLayout(self.testlayout)
        self.formlayout.addRow('',self.testwidget)
        

        self.label = QLabel("欢迎使用图书馆管理系统")
        fontlabel = QFont()
        fontlabel.setPixelSize(30)
        self.label.setFixedWidth(390)
        #pixmap=QPixmap('index.jpg').scaled(self.label.width(), self.label.height())
        #self.label.setPixmap(pixmap)
        #self.label.setStyleSheet("QLabel{background-image:url(index.jpg)}") 
        # self.label.setFixedHeight(80)             #不设置宽度了
        self.label.setFont(fontlabel)
        self.Hlayout1.addWidget(self.label, Qt.AlignCenter)
        self.widget1 = QWidget()
        self.widget1.setLayout(self.Hlayout1)
        self.widget2 = QWidget()
        self.widget2.setFixedWidth(300)
        self.widget2.setFixedHeight(150)
        self.widget2.setLayout(self.formlayout)
        
        self.Hlayout2.addWidget(self.widget2, Qt.AlignCenter)
        self.widget = QWidget()
        self.widget.setLayout(self.Hlayout2)
        
        #background-image,当背景图片宽度高度小于窗口的宽度高度时,则会加载多个背景图片 
        #background-image,当背景图片的宽度高度大于窗口的宽度高度时,背景图片会平铺整个背景
       # self.widget1.setStyleSheet("QWidget{background-image:url(index.jpg);}")     #设置背景图片
        self.widget.setStyleSheet("QWidget{border-image:url(index.jpg)}")          # 使用border-image会自适应完全填充这个控件
        #self.widget1.setStyleSheet("color:green")                                  #设置字体颜色
        #self.widget1.setStyleSheet("color:red;background:yellow")                  #设置字体颜色和背景颜色
        self.Vlayout.addWidget(self.widget1)
        self.Vlayout.addWidget(self.widget, Qt.AlignTop)

        self.signIn.clicked.connect(self.signInCheck)
        self.signCancle.clicked.connect(self.signInCancleReset)
        self.lineEdit2.returnPressed.connect(self.signInCheck)
        self.lineEdit1.returnPressed.connect(self.signInCheck)

    def signInCancleReset(self):
        self.lineEdit1.clear()  
        self.lineEdit2.clear()  


    def signInCheck(self):
        studentId = self.lineEdit1.text()
        password = self.lineEdit2.text()
        if (studentId == "" or password == ""):
            print(QMessageBox.warning(self, "警告", "学号和密码不可为空!", QMessageBox.Yes, QMessageBox.Yes))
            return

        hl = hashlib.md5()                                              #md5加密对象
        hl.update(password.encode(encoding='utf-8'))                    # 将密码更新为MD5加密对象

        userdata=self.userdb.querybyUserid(studentId)
        if (not userdata):
            #QMessageBox.information()返回值是一个整形变量,是点击按钮所代表的值
            # QMessageBox.Yes       =   16384
            # QMessageBox.No        =   65536
            # QMessageBox.Close     =   2097152
            # QMessageBox.Abort     =   262144
            # QMessageBox.Help     =   16777216
            print(QMessageBox.information(self, "提示", "该账号不存在,请重新输入!", QMessageBox.Yes))     
            self.signInCancleReset()
        else:
            #将输入的密码经过MD5加密之后,重新跟数据库中的值对比
            print( userdata[0][0] )
            print( userdata[0][1] )
            print( userdata[0][2] )
            print( userdata[0][3] )
            print( userdata[0][4] )
            if (studentId == userdata[0][0] and hl.hexdigest() == userdata[0][2]):     
                # 如果是管理员, 再在数据库中,第三项代表是否是管理员,1为管理员,0不是
                if (userdata[0][3]==1):
                    self.is_admin_signal.emit()
                else:
                    self.is_student_signal.emit(studentId)
            else:
                print(QMessageBox.information(self, "提示", "密码错误!", QMessageBox.Yes, QMessageBox.Yes))
        return


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon(":/images/MainWindow_1.png"))
    #app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    

    mainMindow = SignInWidget()
    mainMindow.show()
    sys.exit(app.exec_())

 

posted @ 2019-02-27 16:09  枫奇丶宛南  阅读(189)  评论(0编辑  收藏  举报