关闭 QWidget window
Closing QWidget window
我正在使用以下代码在一段时间后自动关闭 Qwidget window
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
不起作用。在一段时间后自动关闭 window 的最佳方法是什么?
问题是当你把ret = msgBox.exec_()
放在constructor执行完之前,window object还没有构建完成,所以没有什么可以关闭的,所以当对话框关闭,将显示刚刚打开的 window。我完成构建。我们的想法是完成 window 的构建,然后调用 ret = msgBox.exec_()
,为此我们将使用 QTimer.singleShot()
.
另一方面,closeEvent
方法不是必需的,因为我正在尝试这样做。恕我直言,是要从内存中消除 self.errWin2Timer
(尽管似乎有错字,因为您使用 errWin2
而不是 errWin2Timer
),但作为 window 的儿子是没有必要的因为在 Qt 中,如果 parent 死亡,children 也会死亡。
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_())
我正在使用以下代码在一段时间后自动关闭 Qwidget window
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
不起作用。在一段时间后自动关闭 window 的最佳方法是什么?
问题是当你把ret = msgBox.exec_()
放在constructor执行完之前,window object还没有构建完成,所以没有什么可以关闭的,所以当对话框关闭,将显示刚刚打开的 window。我完成构建。我们的想法是完成 window 的构建,然后调用 ret = msgBox.exec_()
,为此我们将使用 QTimer.singleShot()
.
另一方面,closeEvent
方法不是必需的,因为我正在尝试这样做。恕我直言,是要从内存中消除 self.errWin2Timer
(尽管似乎有错字,因为您使用 errWin2
而不是 errWin2Timer
),但作为 window 的儿子是没有必要的因为在 Qt 中,如果 parent 死亡,children 也会死亡。
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_())