关闭QWidget wind

2024-07-03 07:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用下面的代码关闭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不起作用。一段时间后自动关闭窗口的最佳方法是什么


Tags: selfeventcloseinitdefokretqtgui
1条回答
网友
1楼 · 发布于 2024-07-03 07:22:12

问题是,当您在构造函数完成执行之前放置ret = msgBox.exec_()时,窗口对象尚未完成构建,因此没有要关闭的对象,因此当对话框关闭时,将显示刚刚打开的窗口。我完成了建筑。我们的想法是完成窗口的构建,然后调用ret = msgBox.exec_(),为此我们将使用QTimer.singleShot()

另一方面,closeEvent方法是不必要的,因为我正在尝试这样做。IMHO是从内存中消除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_())

相关问题 更多 >