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_())