PyQt5登录成功后无法打开主窗口问题求助
问题解决:PyQt5登录成功后无法打开主窗口
错误原因分析
- 错误的窗口创建方式:
open_app方法中使用self.QtWidgets.QMainWindow()是错误的,QtWidgets是你导入的模块,并非LoginForm类的属性,直接调用模块下的类即可。 - 不必要的继承:
LoginForm继承Ui_MainWindow完全多余,登录窗口和主窗口UI是独立的,这种继承会造成逻辑混淆。
修正后的完整代码
# -*- coding: utf-8 -*- import pysftp, datetime as dt from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QMessageBox, QCheckBox, QHBoxLayout, QWidget, QGridLayout, QLabel, QLineEdit, QPushButton from PyQt5.QtGui import QIntValidator, QPixmap, QIcon class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(711, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(250, 90, 47, 14)) self.label.setObjectName("label") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 711, 22)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label.setText(_translate("MainWindow", "Hey ")) # 移除不必要的Ui_MainWindow继承 class LoginForm(QWidget): def __init__(self): super().__init__() self.setWindowTitle('SFTP Client v1.0 - Login') self.resize(400, 50) icon = QIcon("./img/icon1.ico") QWidget.setWindowIcon(self, icon) layout = QGridLayout() label_name = QLabel('<font size="4"> Username: </font>') self.lineEdit_username = QLineEdit() self.lineEdit_username.setPlaceholderText('Please enter your username') layout.addWidget(label_name, 0, 0) layout.addWidget(self.lineEdit_username, 0, 1) label_password = QLabel('<font size="4"> Password: </font>') self.lineEdit_password = QLineEdit() self.lineEdit_password.setEchoMode(QLineEdit.Password) self.lineEdit_password.setPlaceholderText('Please enter your password') layout.addWidget(label_password, 1, 0) layout.addWidget(self.lineEdit_password, 1, 1) button_login = QPushButton('Login') button_login.clicked.connect(self.check_password) layout.addWidget(button_login, 1, 0, 2, 10) layout.setRowMinimumHeight(2, 75) self.setLayout(layout) def open_app(self): print('trying to open') # 修正QMainWindow创建方式,直接使用导入的QtWidgets模块 self.MainWindow = QtWidgets.QMainWindow() self.ui = Ui_MainWindow() self.ui.setupUi(self.MainWindow) self.MainWindow.show() # 登录成功后隐藏登录窗口 self.hide() def check_password(self): msg = QMessageBox() login_result = self.lineEdit_username.text() == 'admin' and self.lineEdit_password.text() == '0000' if login_result: icon = QPixmap("./img/icon1.ico") msg.setIconPixmap(icon) msg.setText('Login successful!\nPress OK to open the SFTP Client') msg.setWindowTitle('SFTP Client Login') msg.exec_() self.open_app() else: icon = QPixmap("./img/icon1.ico") msg.setIconPixmap(icon) msg.setWindowTitle('SFTP Client Login') msg.setText('Incorrect username/password!\nPlease enter the correct username and password') msg.exec_() if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) login = LoginForm() login.show() sys.exit(app.exec_())
关键修改点说明
- 移除多余继承:
LoginForm仅继承QWidget,避免和主窗口UI类混淆。 - 修正窗口创建代码:将
self.QtWidgets.QMainWindow()改为QtWidgets.QMainWindow(),直接调用导入模块中的类。 - 添加登录窗口隐藏:在
open_app中加入self.hide(),登录成功后自动隐藏登录界面,提升体验。
内容的提问来源于stack exchange,提问作者Yidir
相关产品推荐
相关产品推荐

