Wie ein QDialog von der Ausführung noch in der __init__ Aussage (oder unmittelbar nach) zu stoppen?

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

  •  18-09-2019
  •  | 
  •  

Frage

Ich frage mich, wie ich über die Einstellung Dialog aus Öffnung gehen kann, wenn bestimmte Bedingungen in seiner __init__ Anweisung erfüllt sind.

Der folgende Code versucht, den ‚self.close ()‘ Funktion aufzurufen, und es funktioniert, aber (ich gehe mal davon aus), da der Dialog noch nicht seine Ereignisschleife gestartet, dass es nicht das close-Ereignis auslöst? So gibt es eine andere Art und Weise zu schließen und / oder den Dialog Öffnen zu stoppen, ohne Auslösung eines Ereignisses?

Beispielcode:

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"
War es hilfreich?

Lösung

Der Dialog wird nur dann ausgeführt werden, wenn exec_ Methode aufgerufen wird. Sie sollten daher Bedingungen im exec_ Verfahren überprüfen und wenn sie erfüllt sind, führen exec_ von QDialog.

Eine andere Methode ist eine Ausnahme innerhalb des Konstruktors zu erhöhen (obwohl ich nicht sicher bin, ist es eine gute Praxis, in anderen Sprachen sollten Sie in der Regel nicht ein solches Verhalten innerhalb Konstruktor erlauben) und nach draußen zu fangen. Wenn Sie eine Ausnahme zu fangen, einfach nicht läuft exec_ Methode.

Denken Sie daran, dass, wenn Sie exec_ laufen, Sie brauchen nicht das Fenster zu schließen. Der Dialog ist so aufgebaut, aber noch nicht gezeigt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top