2010-09-30 55 views
5

我正在收集我的應用程序的使用情況統計信息,其中包括每個會話的持續時間。但是,我似乎無法保存這些信息,因爲我嘗試過的所有信號都沒有成功調用我的report_session函數。有沒有辦法在PyQt應用程序結束之前調用一個函數?

這是我已經嘗試過的信號:

  1. lastWindowClosed()
  2. aboutToQuit()
  3. 銷燬()

兩種信號都永遠不會發出或應用程序做在運行其他任何東西之後不夠長。這是我的主:

app = QtGui.QApplication(sys.argv) 

ui = MainWindow() 
ui.app = app 
QtCore.QObject.connect(ui, QtCore.SIGNAL("destroyed()"), ui.report_session) 
ui.show() 
logger.info('Started!') 
splash.finish(ui) 

sys.exit(app.exec_()) 

回答

1

Found this answer其中涉及重載closeEvent()。

它對我來說非常合適。

2

把代碼app.exec_sys.exit之間:

ret = app.exec_() 
# Your code that must run when the application closes goes here 
sys.exit(ret) 
4

爲了確保Python函數被調用的進程終止,一般(有或沒有的Qt參與;-) ,你可以使用atexit模塊標準Python庫:

import atexit 

def whatever(): ... 

atexit.register(whatever) 

出於謹慎的我會建議不要使用綁定的方法而不是爲此目的的功能 - 它「應該」起作用,但是一個過程的銷燬階段總是有些微妙,而且保持越簡單越好。

atexit不會觸發過程的足夠硬的碰撞,當然(例如,如果該進程被終止了kill -9,然後定義它不會有機會運行任何終止密碼子) - - 操作系統認識到這一點;-)。如果你需要處理任何崩潰,無論你從一個單獨的「看門狗」過程中必須如何努力,這是一個非常微妙的問題。

+0

我還沒有嘗試過,雖然我知道atexit模塊。我最終希望重新實現QApplication的closeEvent方法。 – fccoelho 2010-09-30 17:15:33

3

Mark Byers發佈的方法將在主窗口小部件關閉後運行,這意味着其控件將不再可用。

如果你需要從你的窗體上的控件的任何值的工作,你會想捕捉的關閉事件,做你的工作有:

class MainWidget(QtGui.QWidget): 

    #... 

    def closeEvent(self, event): 
     print "closing PyQtTest" 
     self.SaveSettings() 
     # report_session() 

而且,看到ZetCode教程消息框示例First programs in PyQt4 toolkit(接近頁面尾部)。這顯示瞭如何接受或取消關閉請求。

相關問題