Python PYQT5-如何使用PyQT(MVC)调用另一个屏幕
伙计们 我正在与QTDesigner和PyQT5合作,我已经使用QTDesi创建了两个屏幕。一个登录表单和一个主表单。我正在尝试在登录屏幕之后调用主屏幕。但它不起作用。我看过很多教程,但没有一本对我有用 下面是一些代码: 为了调用登录屏幕,我在Controller上使用了以下类:Python PYQT5-如何使用PyQT(MVC)调用另一个屏幕,python,python-3.x,qt,pyqt,pyqt5,Python,Python 3.x,Qt,Pyqt,Pyqt5,伙计们 我正在与QTDesigner和PyQT5合作,我已经使用QTDesi创建了两个屏幕。一个登录表单和一个主表单。我正在尝试在登录屏幕之后调用主屏幕。但它不起作用。我看过很多教程,但没有一本对我有用 下面是一些代码: 为了调用登录屏幕,我在Controller上使用了以下类: class LoginController(QtWidgets.QDialog, Ui_Dialog): def __init__(self, parent=None): QtWidgets.Q
class LoginController(QtWidgets.QDialog, Ui_Dialog):
def __init__(self, parent=None):
QtWidgets.QMainWindow.__init__(self, parent=parent)
super().__init__(parent)
self.setupUi(self)
self.txtLogo.setPixmap(QtGui.QPixmap('../gui/img/icons/aperam.png'))
self.action_performed()
def action_performed(self):
self.pushButton.clicked.connect(self.valid_login)
def valid_login(self):
user = self.txtUser.text()
password = self.txtPassword.text()
if model.validate_login(user, password):
self.close()
main = HomeScreen()
然后,要调用主屏幕,我使用以下命令:
class HomeScreen(Ui_Model):
def __init__(self):
super(HomeScreen, self).__init__()
self.ui = Ui_Model()
self.main = QtWidgets.QMainWindow()
self.login_home_screen()
def login_home_screen(self):
self.ui.setupUi(self.main)
self.main.show()
self.ui.actionNovo.triggered.connect(self.user_screen_show)
self.main.close()
但这对我不起作用。它只显示一个黑屏,然后关闭
从系统开始,我调用LoginScreen的代码如下:
cd = LoginController()
if __name__ == "__main__":
import sys
ui = LoginController()
cd.show()
sys.exit(app.exec_())
你能帮我吗?我试过阅读很多教程和文章,但都不起作用。我想在登录成功后调用另一个表单
谢谢您的代码存在各种问题 主屏幕也应该从QMainWindow继承,而不仅仅是从Ui_模型继承; 您应该避免混合QWidget/uic创建样式; 如果同时调用super,则不应调用基类uuu init uuu; 您创建了一个主屏幕实例main,但随后该函数返回,这意味着该实例将立即被垃圾收集; 正在创建两个LoginController实例,但您只需要一个; 主屏幕随后显示并关闭,这没有多大意义; 如果在我指的是“执行的操作”和“登录主屏幕”屏幕时只运行其他函数,通常不需要创建其他函数,尤其是如果它们只执行可以包含在uuu init_uu;中的小任务; 对于您的情况,最简单的解决方案是为登录屏幕创建自定义信号,并将其连接到主屏幕窗口的显示功能 请注意,我不知道用户屏幕显示的功能;如果用于再次显示登录,则应使用类似的系统再次显示对话框
class LoginController(QtWidgets.QDialog, Ui_Dialog):
loginSuccessful = QtCore.pyqtSignal()
def __init__(self, parent=None):
super(LoginController, self).__init__(parent)
self.setupUi(self)
self.txtLogo.setPixmap(QtGui.QPixmap('../gui/img/icons/aperam.png'))
self.pushButton.clicked.connect(self.valid_login)
def valid_login(self):
user = self.txtUser.text()
password = self.txtPassword.text()
if model.validate_login(user, password):
# login is valid, emit the signal
self.loginSuccessful.emit()
self.hide()
class HomeScreen(QtWidgets.QMainWindow, Ui_Model):
newLogin = QtCore.pyqtSignal()
def __init__(self):
super(HomeScreen, self).__init__()
self.setupUi(self)
self.actionNovo.triggered.connect(self.user_screen_show)
def user_screen_show(self):
self.newLogin.emit()
self.hide()
if __name__ == "__main__":
import sys
cd = LoginController()
cd.show()
home = HomeScreen()
cd.loginSuccessful.connect(home.show)
home.newLogin.connect(cd.show)
sys.exit(app.exec_())
您好,我已经按照您的建议包装了定制信号机,它工作得很好。就像你说的,我已经在代码中修复了07个bug。我假装在登录类中调用主屏幕,这可能是他不工作的原因。现在它的工作属性,我将使用相同的方法来改进系统的另一个屏幕。非常感谢你!在一个类中创建一个新的小部件实例并没有错,这只是一个类层次结构和编程逻辑的问题。由于垃圾收集,该对象是本地对象,并且由于它没有其他引用,因此在函数返回时会立即删除该对象,并且由于关闭调用,该对象不会工作。