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

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("退出程序")

改动说明:

  1. 修复所有类的__init__拼写错误
  2. 给usermain的构造函数添加user参数,将其保存为实例变量self.current_user
  3. 在userlogin的登录验证通过后,创建usermain实例并传入user,同时切换StackedWidget的当前页面
  4. 补全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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:50:24