PyQt中登录框设计

很多软件,比如QQ,亦或一些管理系统,运行之后都会先弹出一个登录框,只有登录成功了,才能进入软件主界面。
以前在邮件列表中回答过如何做登录框,这里重新整理下。
从刚开始做Delphi的时候就有不少人纠结登录框问题,我考虑造成困惑的原因是有几个地方搞不明白:何时弹出登录框?何处弹出登录框?登录逻辑写在何处?
这里有两种方案:
在打开主窗体前打开登录对话框,如果验证成功,再创建主窗体并打开;
在创建主窗体时,既__init__方法里创建并显示登录框,如果成功,显示主窗体,失败则退出程序。
我推荐第一种方案,这里也用第一种做例子,逻辑清晰,如果登录验证不成功,直接退出,不需要创建主窗体。为什么会有第二种方案,网上能找到类似的例子,还有以前学Delphi的时候,好多书上都用的第二种方案,其实这种方案不好。
说到这里你可能还是不清楚如何弄,那我们弄得更简单点,抛开登录框不谈,定义一个login方法,如果成功,就创建并显示主窗体,失败则退出:
def login():
"""返回True或False"""
returnTrue
 
if __name__ =='__main__':
import sys
app =QtGui.QApplication(sys.argv)
if login():
mainWindow =QtGui.QMainWindow()
mainWindow.show()
sys.exit(app.exec_())
现在应该很清楚了吧,把打开登录框隐藏到login里,并根据登录框的结果返回值。
def login():
"""返回True或False"""
dialog =LoginDialog()
if dialog.exec_():
returnTrue
else:
returnFalse
在登录框中验证是否成功,验证这块如果复杂,你可以放到其他模块中,在登录框中进行调用,给登录按钮绑定事件处理即可。
classLoginDialog(QtGui.QDialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setWindowTitle(u'登录')
self.resize(300,150)
 
self.leName =QtGui.QLineEdit(self)
self.leName.setPlaceholderText(u'用户名')
 
self.lePassword =QtGui.QLineEdit(self)
self.lePassword.setEchoMode(QtGui.QLineEdit.Password)
self.lePassword.setPlaceholderText(u'密码')
 
self.pbLogin =QtGui.QPushButton(u'登录',self)
self.pbCancel =QtGui.QPushButton(u'取消',self)
 
self.pbLogin.clicked.connect(self.login)
self.pbCancel.clicked.connect(self.reject)
 
layout =QtGui.QVBoxLayout()
layout.addWidget(self.leName)
layout.addWidget(self.lePassword)
 
# 放一个间隔对象美化布局
spacerItem =QtGui.QSpacerItem(20,48,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
layout.addItem(spacerItem)
 
# 按钮布局
buttonLayout =QtGui.QHBoxLayout()
# 左侧放一个间隔
spancerItem2 =QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
buttonLayout.addItem(spancerItem2)
buttonLayout.addWidget(self.pbLogin)
buttonLayout.addWidget(self.pbCancel)
 
layout.addLayout(buttonLayout)
 
self.setLayout(layout)
完整代码和截图如下:
# -*- coding: utf-8 -*-
fromPyQt4importQtGui,QtCore
 
classLoginDialog(QtGui.QDialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.setWindowTitle(u'登录')
self.resize(300,150)
 
self.leName =QtGui.QLineEdit(self)
self.leName.setPlaceholderText(u'用户名')
 
self.lePassword =QtGui.QLineEdit(self)
self.lePassword.setEchoMode(QtGui.QLineEdit.Password)
self.lePassword.setPlaceholderText(u'密码')
 
self.pbLogin =QtGui.QPushButton(u'登录',self)
self.pbCancel =QtGui.QPushButton(u'取消',self)
 
self.pbLogin.clicked.connect(self.login)
self.pbCancel.clicked.connect(self.reject)
 
layout =QtGui.QVBoxLayout()
layout.addWidget(self.leName)
layout.addWidget(self.lePassword)
 
# 放一个间隔对象美化布局
spacerItem =QtGui.QSpacerItem(20,48,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
layout.addItem(spacerItem)
 
# 按钮布局
buttonLayout =QtGui.QHBoxLayout()
# 左侧放一个间隔
spancerItem2 =QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
buttonLayout.addItem(spancerItem2)
buttonLayout.addWidget(self.pbLogin)
buttonLayout.addWidget(self.pbCancel)
 
layout.addLayout(buttonLayout)
 
self.setLayout(layout)
 
def login(self):
print'login'
ifself.leName.text()=='admin'andself.lePassword.text()=='jimmykuu':
self.accept()# 关闭对话框并返回1
else:
QtGui.QMessageBox.critical(self, u'错误', u'用户名密码不匹配')
 
 
def login():
"""返回True或False"""
dialog =LoginDialog()
if dialog.exec_():
returnTrue
else:
returnFalse
 
if __name__ =='__main__':
import sys
app =QtGui.QApplication(sys.argv)
if login():
mainWindow =QtGui.QMainWindow()
mainWindow.show()
sys.exit(app.exec_())
"""如果不写login方法可以这么写:
dialog = LoginDialog()
if dialog.exec_():
mainWindow = QtGui.QMainWindow()
mainWindow.show()
sys.exit(app.exec_())
"""

http://jimmykuu.qiniudn.com/blog/10_1.jpg
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值