Comment arrêter un QDialog d'exécuter tout en restant dans la déclaration __init__ (ou immédiatement après)?

StackOverflow https://stackoverflow.com/questions/2405750

  •  18-09-2019
  •  | 
  •  

Question

Je me demande comment je peux aller à arrêter une boîte de dialogue d'ouverture si certaines conditions sont remplies dans sa déclaration de __init__.

Le code suivant tente d'appeler la fonction « self.close () » et il le fait, mais (je suppose) depuis la boîte de dialogue n'a pas encore commencé sa boucle d'événement, qu'il ne déclenche pas l'événement de fermeture? Donc, il y a une autre façon de fermer et / ou arrêter la boîte de dialogue d'ouverture sans déclencher un événement?

Exemple de code:

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"
Était-ce utile?

La solution

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

Autre méthode consiste à soulever une exception dans le constructeur (si je ne suis pas sûr, il est une bonne pratique, dans d'autres langues que vous devriez généralement pas permettre un tel comportement à l'intérieur de constructeur) et l'attraper à l'extérieur. Si vous attrapez une exception, il suffit de ne pas exécuter la méthode exec_.

Rappelez-vous, que si vous exécutez exec_, vous n'avez pas besoin de fermer la fenêtre. La boîte de dialogue est construit, mais pas encore montré.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top