2012-02-21 191 views
0

该应用程序以一个登录窗体开始,当用户和密码正确时,它启动主窗口。我无法关闭登录表单(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() 

回答

0

如果window是一个实例QMainWindow,它不会有一个exec_方法。但是如果这样做,exec_意味着该窗口将是模态的,因此阻塞直到用户关闭它。

在另一方面,如果使用window.show()避免阻塞,在LoginForm关闭本身 - 但是因为你没有保持引用它的任何地方window将立即垃圾收集。

假设LoginFormQDialog,我建议你利用其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_())