很多软件,比如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_())
"""

PyQt中登录框设计的更多相关文章

  1. 【转载】拒绝平庸——浅谈WEB登录页面设计

    用户活跃度是检验产品成功与否的重要指标之一,传统行业的商家极为重视门面的装潢,因为一个好的门面可以聚集人气,招揽更多的顾客.古时候的大户人家院子门口的石狮子或其他的摆件的摆放极为讲究,有一定的风水学说 ...

  2. 拒绝平庸——浅谈WEB登录页面设计

    用户活跃度是检验产品成功与否的重要指标之一,传统行业的商家极为重视门面的装潢,因为一个好的门面可以聚集人气,招揽更多的顾客.古时候的大户人家院子门口的石狮子或其他的摆件的摆放极为讲究,有一定的风水学说 ...

  3. VUE中登录密码显示与隐藏的最简设计——基于iview

    目录 VUE中登录密码显示与隐藏的最简设计--基于iview 1.背景 2.实现最终效果 2.1 隐藏密码 2.2 显示密码 3.实现思路 3.1 v-if判断当前密码显示状态 3.2 密码隐藏状态 ...

  4. 选择屏幕中的下拉框和dialog中下拉框设计

    REPORT  YTEST014. PARAMETERS: auart LIKE vapma-auart  AS LISTBOX   VISIBLE LENGTH 6. AT SELECTION-SC ...

  5. SQLServer Management Studio登录框中的“服务器名”填写

    SQL Server Management Studio登录框中的“服务器名”填写 by:授客 QQ:1033553122 打开MSSQL Management Studio,如图,登录框中怎么填写? ...

  6. ASP.NET中登录功能的简单逻辑设计

     ASP.NET中登录功能的简单逻辑设计                               概述                               逻辑设计             ...

  7. 第三十四章、PyQt中的输入部件:QComboBox组合框功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 Designer中输入工具部件中的Combo Box组合框与 ...

  8. pyQt 每日一练习 -- 登录框

    #coding=utf-8 #第一个练习,登录框 import sys from PyQt4 import QtGui,QtCore #登录框 class LoginBox(QtGui.QWidget ...

  9. java web 登录框

    我们会骂 12306 的网站界面挫,效果差,速度慢,回头看看自己写的代码,是不是也一样的狗血!在前端,很多看似简单的东西,内藏无数玄机.本文将以一个小小的登录框为入口,谈一谈如何完善自己的程序. 在很 ...

随机推荐

  1. iframe 自适应高度、宽度

    示例: <iframe id="zyms" frameborder="0" scrolling="yes" style="w ...

  2. IOS 表视图(UITableVIew)的使用方法(7)表视图的编辑功能(拖拉调整排序位置)

    除了每个单元行左边的删除和新增图标,UITableView还支持在单元行的右侧显示一个供用户拖拉调整排序位置的控件. 不过如果要显示此控件,UITableView的数据源需要实现以下的方法. -(vo ...

  3. QT实现,通过URL下载文件的接口实现

    今天来把坑填上. 具体就是提供一个URL,并通过这个URL下载文件. MyDownloader.h: #ifndef MYDOWNLOADER_H #define MYDOWNLOADER_H cla ...

  4. rsync、ssh备份

    Linux系统需求 为了实现这个备份程序,需要准备一个外部驱动器.您可以将备份写到一个外部USB磁盘,但这样做效率不高.因此,我假设您将备份写到位于网络某处的服务器中.这台服务器要为带有SSH和rsy ...

  5. Windows Azure 存储的冗余存储选项和只读访问跨地域冗余存储

    我们很高兴地宣布,现在我们使客户可以获得对数据更高的读取可用性.该预览功能称为"只读访问- 跨地域冗余存储(RA-GRS)",使客户可以在存储帐户主要区域无法读取数据时,通过跨 ...

  6. commview for wifi 破解无线

    相信了解无线网络的读者都知道安全性是无线网络的先天不足,正是因为他的传播通过空气,所以信号很容易出现外泄问题,相比有线网络来说信号监听变得非常简单. 部分用户通过WEP加密的方式来保护网络通讯数据包避 ...

  7. Android ScrollView嵌套HorizontalScrollView 滑动问题 ScrollView包括GridView显示问题

    今天项目使用到ScrollView嵌套HorizontalScrollView,ScrollView里包括GridView,发现几个问题非常经典.在此记录: 问题1.ScrollView嵌套Horiz ...

  8. [C#]窗体切换--避免开启多个线程

    先说说这个多窗体的界面的解决的办法: 用到的方法很简单,就是程序运行就建立一个MainForm,在这个MainForm中设立一个Panel,同时设立几个按钮,按下每个按钮都在这个Panel中载入不同的 ...

  9. YIi配置debug工具、yii配置gii工具

    $config['bootstrap'][] = 'debug';$config['modules']['debug'] = [ 'class'=>'yii\debug\Module', 'al ...

  10. 使用phpQuery实现批量文件处理

    能够将置顶文夹下的指定类型文件进行处理 <?php header('Content-Type:text/html;Charset=utf-8'); include './phpQuery/php ...