• PyQt中登录框设计


    很多软件,比如QQ,亦或一些管理系统,运行之后都会先弹出一个登录框,只有登录成功了,才能进入软件主界面。

    以前在邮件列表中回答过如何做登录框,这里重新整理下。

    从刚开始做Delphi的时候就有不少人纠结登录框问题,我考虑造成困惑的原因是有几个地方搞不明白:何时弹出登录框?何处弹出登录框?登录逻辑写在何处?

    这里有两种方案:

    在打开主窗体前打开登录对话框,如果验证成功,再创建主窗体并打开;
    在创建主窗体时,既__init__方法里创建并显示登录框,如果成功,显示主窗体,失败则退出程序。
    我推荐第一种方案,这里也用第一种做例子,逻辑清晰,如果登录验证不成功,直接退出,不需要创建主窗体。为什么会有第二种方案,网上能找到类似的例子,还有以前学Delphi的时候,好多书上都用的第二种方案,其实这种方案不好。

    说到这里你可能还是不清楚如何弄,那我们弄得更简单点,抛开登录框不谈,定义一个login方法,如果成功,就创建并显示主窗体,失败则退出:

    def login():
    """返回True或False"""
    return True

    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_():
    return True
    else:
    return False
    在登录框中验证是否成功,验证这块如果复杂,你可以放到其他模块中,在登录框中进行调用,给登录按钮绑定事件处理即可。

    class LoginDialog(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 -*-
    from PyQt4 import QtGui, QtCore

    class LoginDialog(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'
    if self.leName.text() == 'admin' and self.lePassword.text() == 'jimmykuu':
    self.accept() # 关闭对话框并返回1
    else:
    QtGui.QMessageBox.critical(self, u'错误', u'用户名密码不匹配')


    def login():
    """返回True或False"""
    dialog = LoginDialog()
    if dialog.exec_():
    return True
    else:
    return False

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

  • 相关阅读:
    ES6-->ECMAScript 6.0 新增方法,一些基本语法
    初识 Nodejs (了解Nodejs)
    Vue框架初识
    python语法入门之流程控制
    python中基本运算符
    格式化输出
    基本数据类型
    变量,解释器,垃圾回收机制,小整数池总结
    编程语言发展史
    计算机基础
  • 原文地址:https://www.cnblogs.com/jsben/p/4909904.html
Copyright © 2020-2023  润新知