Закрытие окна QWidget - PullRequest
       31

Закрытие окна QWidget

0 голосов
/ 26 декабря 2018

Я использую следующий код для автоматического закрытия окна Qwidget через некоторое время

class ErrorWindow2(QtGui.QWidget):
    def __init__( self ):
        QtGui.QWidget.__init__( self, None, QtCore.Qt.WindowStaysOnTopHint)

        msgBox = QMessageBox(self)
        msgBox.move (500,500)
        msgBox.setIcon(QMessageBox.Critical)
        msgBox.setText("Test 2")

        msgBox.setWindowTitle("ERROR")
        msgBox.setStandardButtons(QMessageBox.Ok)

        self.errWin2Timer = QtCore.QTimer()
        self.errWin2Timer.timeout.connect(self.closeBox)
        self.errWin2Timer.setSingleShot(True)
        self.errWin2Timer.start(10000)

        ret = msgBox.exec_()

        if ret == QtGui.QMessageBox.Ok:
            return
        else:
            return

    def closeBox(self):
        self.close()

    def closeEvent(self, event):
        logger.debug("Reached Error window 1 close event")
        if self.errWin2:
            self.errWin2.stop()
            self.errWin2.deleteLater()
        event.accept()

Но проблема в том, что self.close не работает.Каков наилучший способ автоматически закрыть окно через некоторое время?

1 Ответ

0 голосов
/ 26 декабря 2018

Проблема в том, что когда вы ставите 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_())
...