PyQt5使用loadUi加载QtDesigner制作的UI后点击按钮崩溃如何解决
问题根因
你代码中唯一的致命错误是Register类的信号绑定语句多写了括号,导致绑定的是函数执行后的返回值,而非函数对象本身:
# 错误写法,会在Register类初始化时立即执行signup方法,而非点击按钮时触发 self.signupfun.clicked.connect(self.signup())
该错误会触发非法调用/栈溢出问题,对应你拿到的0xC0000409报错码。你用全局widget变量的写法虽不规范但不会直接导致崩溃。
修复方案
把Register类里的信号绑定语句去掉括号即可,同时可以优化全局变量调用逻辑避免后续出现内存泄漏问题,修复后完整代码如下:
import sys from PyQt5 import QtWidgets from PyQt5.QtWidgets import QDialog,QApplication from PyQt5.uic import loadUi class Login(QDialog): def __init__(self, stacked_widget): super(Login,self).__init__() self.stacked_widget = stacked_widget loadUi("Login.ui",self) self.loginfun.clicked.connect(self.loginfunction) self.password.setEchoMode(QtWidgets.QLineEdit.Password) self.regbutt.clicked.connect(self.gotoregister) def loginfunction(self): email=self.email.text() password=self.password.text() print(f"Successfully logged in with email: {email} and password: {password}") def gotoregister(self): reg = Register(self.stacked_widget) self.stacked_widget.addWidget(reg) self.stacked_widget.setCurrentIndex(self.stacked_widget.currentIndex()+1) class Register(QDialog): def __init__(self, stacked_widget): super(Register, self).__init__() self.stacked_widget = stacked_widget loadUi("Register.ui",self) # 去掉signup后的括号,绑定函数对象本身 self.signupfun.clicked.connect(self.signup) def signup(self): email = self.email.text() if self.password.text() == self.cpassword.text() : password = self.password.text() print(f"Successfully Created Account with email: {email} and password: {password}") login = Login(self.stacked_widget) self.stacked_widget.addWidget(login) self.stacked_widget.setCurrentIndex(self.stacked_widget.currentIndex()+1) else: print("Passwords doesn't Match") if __name__ == '__main__': app=QApplication(sys.argv) widget=QtWidgets.QStackedWidget() window=Login(widget) widget.addWidget(window) widget.setFixedWidth(480) widget.setFixedHeight(620) widget.show() sys.exit(app.exec_())
内容的提问来源于stack exchange,提问作者hokage minato
相关产品推荐
相关产品推荐

