Проблема в том, что когда вы ставите ret = msgBox.exec_()
до завершения выполнения конструктора, объект окна еще не завершен, поэтому закрывать нечего, поэтому при закрытии диалогового окна будет отображаться только что открытое окно,Я заканчиваю строить.Идея состоит в том, чтобы закончить построение окна и затем вызвать ret = msgBox.exec_()
, и для этого мы будем использовать QTimer.singleShot()
.
С другой стороны, метод closeEvent
не является необходимым, так как я пытался сделатьЭто.ИМХО состоит в том, чтобы исключить self.errWin2Timer
из памяти (хотя кажется, что была опечатка, так как вы используете errWin2
вместо errWin2Timer
), но быть сыном окна не обязательно, так как в Qt, если родитель умирает, дети будути умри.
from PyQt4 import QtCore,QtGui
class ErrorWindow2(QtGui.QWidget):
def __init__( self ):
super(ErrorWindow2, self).__init__(None, QtCore.Qt.WindowStaysOnTopHint)
self.errWin2Timer = QtCore.QTimer(self,
interval=10*1000,
singleShot=True,
timeout=self.close)
self.errWin2Timer.start()
QtCore.QTimer.singleShot(0, self.showMessageBox)
def showMessageBox(self):
msgBox = QtGui.QMessageBox(self)
msgBox.move (500,500)
msgBox.setIcon(QtGui.QMessageBox.Critical)
msgBox.setText("Test 2")
ret = msgBox.exec_()
if ret == QtGui.QMessageBox.Ok:
print("OK")
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
w = ErrorWindow2()
w.show()
sys.exit(app.exec_())