2014-09-17 1 views
1

부모 윈도우의 closeevent와 PyQt는 메시지 박스를 닫기나는 케이크의 조각을 folllowing 한

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 (즉, 응답)를 완료도 reply.close()

답변

2

또 다른 방법은 전화처럼 iteslef에 의해 폐쇄 될 때, 그것은 창에 눌렀 X 버튼으로 위젯을 닫습니다 bool QWidget.close (self) 전화를 정확히 것을 달성한다 . (또는이 경우에는 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_()) 
관련 문제