I have folllowing piece of cake
def __init__():
self._taskInProgress = threading.Event()
def isFinished(self):
self._taskInProgress.clear()
self.progressBar.hide()
self.close()
def closeEvent(self, event):
if self._taskInProgress.is_set():
reply = QtGui.QMessageBox.question(self, "Are you sure you want to quit? ",
"Task is in progress !",
QtGui.QMessageBox.Yes,
QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()
the problem is if somebody closes the parent window(i.e. self) the above prompt shows up , but if somebody doesn't press yes or no in this message box the parent window doesn't closes.
So how should I achieve that when task finishes the QMessageBox
(i.e. reply) is also closed by iteslef, like calling reply.close()
Another way, It's exactly to call bool QWidget.close (self)
to close widget by not press X button in window. (Or in this case is call isFinished
). We can override is close method and add flag to control QWidget.closeEvent (self, QCloseEvent)
. Like this;
import sys
from PyQt4 import QtCore, QtGui
class QCsMainWindow (QtGui.QMainWindow):
def __init__ (self):
super(QCsMainWindow, self).__init__()
self.isDirectlyClose = False
QtCore.QTimer.singleShot(5 * 1000, self.close) # For simulate test direct close
def close (self):
for childQWidget in self.findChildren(QtGui.QWidget):
childQWidget.close()
self.isDirectlyClose = True
return QtGui.QMainWindow.close(self)
def closeEvent (self, eventQCloseEvent):
if self.isDirectlyClose:
eventQCloseEvent.accept()
else:
answer = QtGui.QMessageBox.question (
self,
'Are you sure you want to quit ?',
'Task is in progress !',
QtGui.QMessageBox.Yes,
QtGui.QMessageBox.No)
if (answer == QtGui.QMessageBox.Yes) or (self.isDirectlyClose == True):
eventQCloseEvent.accept()
else:
eventQCloseEvent.ignore()
appQApplication = QtGui.QApplication(sys.argv)
mainQWidget = QCsMainWindow()
mainQWidget.show()
sys.exit(appQApplication.exec_())