用父窗口的closeevent关闭pyqt messageBox

用父窗口的closeevent关闭pyqt messageBox

问题描述:

我有以下蛋糕

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()

问题是,如果有人关闭了父窗口(即self),则会出现上述提示,但是如果有人没有在此消息框中按yes或no,则父窗口不会关闭.

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.

因此,当任务完成时,我如何实现QMessageBox(即答复)也被iteslef关闭,例如调用reply.close()

So how should I achieve that when task finishes the QMessageBox (i.e. reply) is also closed by iteslef, like calling reply.close()

另一种方法,正是调用 bool QWidget.close (self) 通过不按窗口中的X按钮来关闭小部件. (或者在这种情况下是调用isFinished).我们可以重写close方法并添加标志以控制 QWidget.closeEvent (self, QCloseEvent) .像这样;

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_())