当一个子窗口打开时关闭父窗口
问题描述:
该应用程序以一个登录窗体开始,当用户和密码正确时,它启动主窗口。我无法关闭登录表单(QWidget)。当一个子窗口打开时关闭父窗口
def on_pushButton_login_clicked(self):
username = str(self.ui.lineEdit_usuario.text())
password = str(self.ui.lineEdit_password.text())
if login_user(username, password):
# Hide error if Login fail
self.ui.label_error.hide()
window = Main() # QMainWindow
try:
window.exec_()
except AttributeError:
pass
#self.close() # close LoginForm & open QMainWindow
else:
self.ui.lineEdit_usuario.setFocus()
self.ui.lineEdit_usuario.clear()
self.ui.lineEdit_password.clear()
# Show error if Login fail
self.ui.label_error.show()
答
如果window
是一个实例QMainWindow
,它不会有一个exec_
方法。但是如果这样做,exec_
意味着该窗口将是模态的,因此阻塞直到用户关闭它。
在另一方面,如果使用window.show()
避免阻塞,在LoginForm
将关闭本身 - 但是因为你没有保持引用它的任何地方window
将立即垃圾收集。
假设LoginForm
是QDialog
,我建议你利用其accept插槽,然后重写你的启动代码的工作是这样的:
class LoginForm(QDialog):
...
def on_pushButton_login_clicked(self):
username = str(self.ui.lineEdit_usuario.text())
password = str(self.ui.lineEdit_password.text())
if login_user(username, password):
self.accept()
else:
...
app = QtGui.QApplication(sys.argv)
if LoginForm().exec_() == QtGui.QDialog.Accepted:
window = Main()
window.show()
sys.exit(app.exec_())