如何将一个类中变量的值传递到另一个类的变量中?
解决方案
先明确核心问题的修正方向:
- DataPage无需继承LoginScreen:两者是独立界面,继承会导致UI加载重复、逻辑混乱,直接继承QWidget/QDialog即可。
- 通过构造函数传递变量:创建DataPage实例时,把获取到的
summonerName作为参数传入,这是跨类传递数据最直接的方式。 - 修正实例方法调用错误:实例方法必须通过类实例调用,避免直接用类名调用时缺少
self参数的问题。
修改后的完整代码
from PyQt5.QtWidgets import QDialog, QWidget, QMessageBox, QLineEdit from PyQt5.QtCore import Qt from PyQt5.uic import loadUi import sqlite3 # 假设widget是全局定义的QStackedWidget实例 widget = ... class LoginScreen(QDialog): def __init__(self): super().__init__() loadUi("login.ui", self) self.passwordfield.setEchoMode(QLineEdit.Password) self.login.clicked.connect(self.loginfunction) self.hyperlink.setOpenExternalLinks(True) self.about.clicked.connect(self.aboutInfo) def loginfunction(self): user = self.userfield.text() password = self.passwordfield.text() summonerName = None # 初始化变量,避免未定义报错 if len(user) == 0 or len(password) == 0: self.error.setText("Please fill out all fields to proceed") else: db = sqlite3.connect("psudt_login.db") cursor = db.cursor() # 验证用户名密码 cursor.execute("SELECT * FROM userLogin where username = ? AND password = ?", (user, password)) row = cursor.fetchone() if row: # 验证成功后获取召唤师名称 cursor.execute("SELECT summonerName FROM userLogin where username = ?", (user,)) sameRow = cursor.fetchone() summonerName = sameRow[0] print("Login successful") self.error.setText("") # 创建DataPage时传入summonerName dataPage = DataPage(summonerName) widget.addWidget(dataPage) widget.setCurrentIndex(widget.currentIndex() + 1) dataPage.setFixedSize(1600, 1100) else: self.error.setText("Invalid username or password") if summonerName: print("Welcome,", summonerName) return summonerName def keyPressEvent(self, event): if event.key() == Qt.Key_Return: self.loginfunction() # 直接通过实例调用方法,无需类名 def aboutInfo(self): aboutApp = QMessageBox(self) aboutApp.setWindowTitle("About") aboutApp.setText("Edited") aboutApp.exec() class DataPage(QWidget): # 根据UI类型调整,比如QDialog def __init__(self, summoner_name): super().__init__() loadUi("datapage.ui", self) self.summonerName = summoner_name # 保存为实例变量,方便后续使用 # 可直接用self.summonerName做后续逻辑,比如显示在界面 print(f"DataPage loaded for summoner: {self.summonerName}")
关键修改点说明
- DataPage构造函数传参:新增
summoner_name参数接收召唤师名称,保存为实例变量self.summonerName,后续类内所有方法都可直接调用。 - LoginScreen创建DataPage时传值:登录成功后,通过
DataPage(summonerName)把获取到的名称直接传入新页面。 - 初始化summonerName变量:在
loginfunction开头初始化变量,避免用户未填字段时后续代码报错。 - 修正按键事件调用:将
LoginScreen.loginfunction(self)改为self.loginfunction(),符合Python实例方法调用规范。 - 调整DataPage继承关系:从继承LoginScreen改为继承QWidget/QDialog,避免不必要的控件和逻辑冗余。
内容的提问来源于stack exchange,提问作者MJames28
相关产品推荐
相关产品推荐

