2016-06-10 84 views
3

我有一個Qt應用程序,只有一個對話窗口。主要是這樣的:Q系統關閉時QApplication子對象沒有被破壞

QApplication a(argc, argv); 
MyObject * myMobject = new QObject(&a); 
MainWindow w; 
w.show(); 
return a.exec(); 

MyObject構造函數創建一個臨時文件,和析構函數刪除它。

當我通過關閉對話框正常關閉應用程序時,MyObject析構函數按預期方式被調用,因爲它是QApplication的子項,它在main()的棧中分配。

但是,當用戶會話關閉時(註銷,關閉...),文件不會被刪除,表明MyObject析構函數從不被調用。

這是什麼原因?我雖然Windows在會話關閉之前關閉了每個窗口,但看起來像我的進程已終止。

從文檔中,有QCoreApplication::aboutToQuit()信號。但是這個文檔告訴Qt檢測到關機並退出事件循環,最終發出該信號。

如果確實如此,應該返回a.exec(),就像窗口關閉時一樣,QApplication應該與它的子節點一起銷燬,調用MyObject析構函數。換句話說,因爲myObjecta的孩子,所以不應該有任何需要處理aboutToQuit()信號。

+0

http://stackoverflow.com/questions/19195935/how-to-detect-windows-shutdown-or-logoff-in-qt – AnatolyS

+0

我在最後添加了一些關於此的信息。另一篇文章沒有回答這個問題 – galinette

回答

3

直接從QApplication的文檔:

我們建議您清理代碼連接,而不是把它在你的應用程序的main()函數將aboutToQuit()信號。這是因爲,在某些平臺上,QApplication :: exec()調用可能不會返回。例如,在Windows平臺上,當用戶註銷時,系統在Qt關閉所有頂級窗口後終止進程。因此,不能保證應用程序將有時間在QApplication :: exec()調用之後退出其事件循環並在main()函數結束時執行代碼。

+0

該死的,我是RTFM'd。他們本可以將此添加到aboutToQuit() – galinette