2010-03-09 18 views
0

Je me demande comment je peux empêcher l'ouverture d'une boîte de dialogue si certaines conditions sont remplies dans son instruction __init__. Le code suivant essaie d'appeler la fonction 'self.close()' et il le fait, mais (je suppose) puisque le dialogue n'a pas encore démarré sa boucle d'événement, qu'il ne déclenche pas l'événement de fermeture ? Y a-t-il un autre moyen de fermer et/ou d'arrêter l'ouverture de la boîte de dialogue sans déclencher un événement?Comment arrêter l'exécution d'un QDialog dans l'instruction __init__ (ou immédiatement après)?

code Exemple:

from PyQt4 import QtCore, QtGui 

class dlg_closeInit(QtGui.QDialog): 
    ''' 
    Close the dialog if a certain condition is met in the __init__ statement 
    ''' 
    def __init__(self): 
     QtGui.QDialog.__init__(self) 
     self.txt_mytext = QtGui.QLineEdit('some text') 
     self.btn_accept = QtGui.QPushButton('Accept') 

     self.myLayout = QtGui.QVBoxLayout(self) 
     self.myLayout.addWidget(self.txt_mytext) 
     self.myLayout.addWidget(self.btn_accept)   

     self.setLayout(self.myLayout) 
     # Connect the button 
     self.connect(self.btn_accept,QtCore.SIGNAL('clicked()'), self.on_accept) 
     self.close() 

    def on_accept(self): 
     # Get the data... 
     self.mydata = self.txt_mytext.text() 
     self.accept() 

    def get_data(self): 
      return self.mydata 

    def closeEvent(self, event): 
     print 'Closing...' 


if __name__ == '__main__': 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    dialog = dlg_closeInit() 
    if dialog.exec_(): 
     print dialog.get_data() 
    else: 
     print "Failed" 

Répondre

1

La boîte de dialogue sera exécuté que si exec_ méthode est appelée. Vous devriez donc vérifier les conditions dans la méthode exec_ et si elles sont remplies, exécutez exec_ à partir de QDialog.

Une autre méthode consiste à lever une exception dans le constructeur (bien que je ne sois pas sûr, c'est une bonne pratique, dans d'autres langages, vous ne devriez généralement pas autoriser un tel comportement dans le constructeur). Si vous interceptez une exception, n'exécutez tout simplement pas la méthode exec_. N'oubliez pas qu'à moins d'exécuter exec_, vous n'avez pas besoin de fermer la fenêtre. Le dialogue est construit, mais pas encore montré.

+0

Merci pour la réponse! C'est à peu près ce que j'ai fini par faire. Dans l'application actuelle, j'ai un widget qui obtient des informations à partir d'une base de données, mais je passe une connexion de base de données à ce widget. À l'origine, j'essayais d'ouvrir la connexion dans __init__ et de fermer la boîte de dialogue en cas d'échec, d'où l'exemple ci-dessus. Au lieu de cela, je suis en train d'ouvrir la connexion à l'extérieur, et si ça marche je passe dans une connexion de référence sinon je ne lance pas le 'exec_' – Jonathan

+0

Je suis content, je pourrais t'aider :-) Happy hacking avec pyqt :-) – gruszczy