2012-02-21 288 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_())