You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将一个类中变量的值传递到另一个类的变量中?

解决方案

先明确核心问题的修正方向:

  • 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}")

关键修改点说明

  1. DataPage构造函数传参:新增summoner_name参数接收召唤师名称,保存为实例变量self.summonerName,后续类内所有方法都可直接调用。
  2. LoginScreen创建DataPage时传值:登录成功后,通过DataPage(summonerName)把获取到的名称直接传入新页面。
  3. 初始化summonerName变量:在loginfunction开头初始化变量,避免用户未填字段时后续代码报错。
  4. 修正按键事件调用:将LoginScreen.loginfunction(self)改为self.loginfunction(),符合Python实例方法调用规范。
  5. 调整DataPage继承关系:从继承LoginScreen改为继承QWidget/QDialog,避免不必要的控件和逻辑冗余。

内容的提问来源于stack exchange,提问作者MJames28

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:05:22