PyQt5中如何将一个类的函数变量值传递到另一个类窗口
解决PyQt5中userlogin类向usermain类传递user变量的问题
首先纠正你代码里的关键错误:类的初始化方法是__init__(前后各两个下划线),你写成了_init_,这会导致初始化逻辑完全不执行,这也是你之前尝试无效的核心原因之一。
下面提供两种可靠的变量传递方案:
方案一:构造函数传参(最直接高效)
在创建usermain实例时,直接将登录成功的user作为参数传入其构造函数:
from ftplib import parse150 import time import sys import sqlite3 from PyQt5 import QtWidgets from PyQt5.uic import loadUi from PyQt5.QtWidgets import QDialog,QApplication,QStackedWidget ,QMainWindow ,QWidget conn = sqlite3.connect(r"C:\\Users\\Admin\\Desktop\\courier\\courier.db") cur = conn.cursor() # 补全welcomescreen基础实现(你可替换为自己的逻辑) class welcomescreen(QMainWindow): def __init__(self): super().__init__() self.login_btn = QtWidgets.QPushButton("进入登录页", self) self.login_btn.clicked.connect(self.go_to_login) self.setFixedSize(1000,750) def go_to_login(self): login_page = userlogin() widget.addWidget(login_page) widget.setCurrentWidget(login_page) class userlogin(QMainWindow): def __init__(self): super(userlogin,self).__init__() loadUi(r"C:\\Users\\Admin\\Desktop\\courier\\userlogin.ui",self) self.upass.setEchoMode(QtWidgets.QLineEdit.Password) self.login.clicked.connect(self.loginfunction) def loginfunction(self): user = self.username.text() password = self.upass.text() # 数据库登录验证(替换为你的实际逻辑) cur.execute("SELECT * FROM users WHERE username=? AND password=?", (user, password)) result = cur.fetchone() if result: # 登录成功,创建usermain实例并传入user main_page = usermain(user) widget.addWidget(main_page) widget.setCurrentWidget(main_page) else: QtWidgets.QMessageBox.warning(self, "错误", "用户名或密码不正确") class usermain(QMainWindow): def __init__(self, user): super(usermain,self).__init__() loadUi(r"C:\\Users\\Admin\\Desktop\\courier\\usermain.ui",self) # 保存用户变量,后续可直接调用 self.current_user = user # 示例:在界面显示用户名(需usermain.ui中有对应QLabel控件) # self.user_label.setText(f"当前登录:{self.current_user}") #--------------main--------------------- app = QApplication(sys.argv) welcome = welcomescreen() widget = QStackedWidget() widget.addWidget(welcome) widget.setFixedHeight(750) widget.setFixedWidth(1000) widget.show() try: sys.exit(app.exec_()) except: conn.close() print("退出程序")
改动说明:
- 修复所有类的
__init__拼写错误 - 给
usermain的构造函数添加user参数,将其保存为实例变量self.current_user - 在
userlogin的登录验证通过后,创建usermain实例并传入user,同时切换StackedWidget的当前页面 - 补全
welcomescreen的基础跳转逻辑
方案二:PyQt信号槽机制(适合复杂场景)
如果你的页面跳转逻辑分散、耦合度要求低,可以通过信号传递用户信息:
from PyQt5.QtCore import pyqtSignal class userlogin(QMainWindow): # 定义传递用户名的信号 login_success = pyqtSignal(str) def __init__(self): super(userlogin,self).__init__() loadUi(r"C:\\Users\\Admin\\Desktop\\courier\\userlogin.ui",self) self.upass.setEchoMode(QtWidgets.QLineEdit.Password) self.login.clicked.connect(self.loginfunction) def loginfunction(self): user = self.username.text() password = self.upass.text() cur.execute("SELECT * FROM users WHERE username=? AND password=?", (user, password)) result = cur.fetchone() if result: # 发射信号传递用户名 self.login_success.emit(user) # 主逻辑中连接信号 app = QApplication(sys.argv) welcome = welcomescreen() widget = QStackedWidget() widget.addWidget(welcome) widget.setFixedHeight(750) widget.setFixedWidth(1000) def on_login_success(user): main_page = usermain(user) widget.addWidget(main_page) widget.setCurrentWidget(main_page) # 欢迎页跳转时绑定信号 def go_to_login(): login_page = userlogin() login_page.login_success.connect(on_login_success) widget.addWidget(login_page) widget.setCurrentWidget(login_page) welcome.login_btn.clicked.connect(go_to_login) widget.show() try: sys.exit(app.exec_()) except: conn.close() print("退出程序")
方案优势:
- 解耦
userlogin和usermain的依赖,不需要在登录类中直接创建主页面实例 - 适合多页面跳转、逻辑分散的大型项目
内容的提问来源于stack exchange,提问作者Cyberpie
相关产品推荐
相关产品推荐

