2014-09-17 4 views
1

Я folllowing кусок пирогазакрытия PyQT MessageBox с CloseEvent родительского окна

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

проблема, если кто-то закрывает родительское окно (т.е. само) выше подсказка появляется, но если кто-то не делает нажмите да или нет в этом окне сообщения, родительское окно не закрывается.

Так как я должен добиться того, что когда задача завершает QMessageBox (т.е. ответа) также закрыта iteslef, как вызов reply.close()

ответ

2

Другим способом, это точно назвать bool QWidget.close (self) закрыть виджет, не нажать кнопку X в окне , (Или в этом случае - звонок isFinished). Мы можем переопределить метод close и добавить флаг для управления QWidget.closeEvent (self, QCloseEvent). Как это;

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