1 实现功能
- 运行程序,登录窗口显示;
- 登录成功后,登录窗口消失;
- 主界面显示(携带登录用户的身份信息)。
2 主要思路
2.1 程序流程
使用main.py作为全局主窗口,login.py(login.ui) 作为子窗口。
程序入口在 main.py 中,程序先创建 主窗口,但是我没有主动显示它,而是接着创建 登录窗口并主动显示登录窗口。
2.2 用户视角
于是,此时用户看不到主窗口,只能看到一个登录窗口。用户在登录窗口中进行登录操作。若登录成功,这时登录窗口要通知主窗口,告诉主窗口你可以显示了,然后登录窗口再关闭自己(close)。
2.3 登录窗口向主窗口传递登录成功的消息
登录窗口如何向主窗口传递消息呢?
一个简单方法就是将主窗口作为登录窗口的初始参数传递进来,然后登录窗口创建一个属性将主窗口的引用保存起来,以备后用。
login.py 文件代码中的 __init__()函数的第二个参数就是主窗口的引用。
这样登录窗口类内部就可以随时引用主窗口,通过给主窗口的属性进行赋值,或者调用主窗口的函数,向主窗口传递数据和消息。
登录窗口完成自己的使命后,自己关闭自己 self.close() 。
3 示例代码
3.1 主界面代码:
main.py
# python 3.8, pyqt5, PyCharm社区版
# author: https://blog.csdn.net/qilei2010
# main.py
class MyMainWindow(QMainWindow):
""" 软件主界面 """
def __init__(self, parent=None):
super().__init__()
loadUi('mainui.ui', self)
self.loginDlg = None # 保存登录对话框
self.loginUserId = None # 保存登录成功的用户信息
# 接收登录成功的用户信息
def getLoginUser(userid):
self.loginUserId = userid
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
mainwin = MyMainWindow() # 创建窗体对象
# mainwin.show() # 此处不显示窗体,而是由登录对话框控制显示
from login import LoginDlg
mainwin.loginDlg = LoginDlg(mainwin) # 创建窗体对象,将主窗口作为参数传入
mainwin.loginDlg.show() # 显示窗体
sys.exit(app.exec_()) # 程序关闭时退出进程
3.2 登录窗口代码
login.py
# python 3.8, pyqt5, PyCharm社区版
# author: https://blog.csdn.net/qilei2010
# login.py
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QLineEdit, QPushButton, QLabel, QDialog
from PyQt5.uic import loadUi
class LoginDlg(QDialog):
# 需要通过构造函数参数mainWin将主窗口传递进来
def __init__(self, mainWin):
super().__init__()
loadUi('login.ui', self)
self.mainWin = mainWin # 保存主窗口的引用,因为要给主窗口传递信息
self.loginbtn.clicked.connect(self.loginAct) # 登录按钮增加点击响应函数
def loginAct(self):
"""登录按钮响应函数"""
# 此处省略登录验证代码
# 告诉主窗口登录成功
userId = 1949
self.mainWin.getLoginUser(userId) # 向主窗口传递数据
self.mainWin.show() # 使主窗口显示
self.close() # 登录使命完成,关闭自己
运行说明:运行 main.py 即可。