Как остановить выполнение QDialog, все еще находясь в инструкции __init__ (или сразу после)?

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

  •  18-09-2019
  •  | 
  •  

Вопрос

Мне интересно, как я могу остановить открытие диалогового окна, если в его __init__ заявление.

Следующий код пытается вызвать функцию 'self.close()', и это происходит, но (я предполагаю), поскольку диалоговое окно еще не запустило цикл событий, что оно не запускает событие закрытия?Итак, есть ли другой способ закрыть и / или остановить открытие диалогового окна без запуска события?

Пример кода:

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"
Это было полезно?

Решение

Диалоговое окно будет запущено только в том случае, если будет вызван метод exec_.Поэтому вам следует проверить условия в методе exec_ и, если они выполнены, запустить exec_ из QDialog.

Другой метод заключается в создании исключения внутри конструктора (хотя я не уверен, что это хорошая практика;в других языках вы обычно не должны допускать такого поведения внутри конструктора) и перехватывать его снаружи.Если вы поймаете исключение, просто не запускайте exec_ метод.

Помните, что до тех пор, пока вы не запустите exec_, вам не нужно закрывать окно.Диалоговое окно создано, но еще не показано.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top