2011-11-17 197 views
19

我想在應用程序退出之前在Qt應用程序中做一些管家工作(如寫入文件等)。我怎樣才能在Qt中使用這個函數(退出或者其他什麼)?如何在Qt中退出時清理

回答

30

您需要將帶有清理代碼的插槽連接到QCoreApplication::aboutToQuit()信號。

這允許您使用QObject::deleteLater()刪除QObject,並且由於您尚未離開主應用程序事件循環,對象將被刪除。

如果您正在使用需要「關機」呼叫的C庫,則通常可以在從QCoreApplication::exec()返回後執行此操作。

例兩種技術:

int main(int,char**) 
{ 
    QApplication app; 
    library_init(); 
    QWidget window; 
    window.show(); 
    QObject::connect(&app, SIGNAL(aboutToQuit()), &window, SLOT(closing())); 
    const int retval = app.exec(); 
    library_close(); 
    return retval; 
} 
+3

請注意,當前的Qt文檔特別建議在exec返回後不要做任何事情。請參閱(http://doc.qt.io/qt-5/qapplication.html#exec) –

+1

請注意,從終端重新啓動或丟失X連接會觸發不會發出aboutToQuit的:: exit()。 (至少到5.7) – ManuelSchneid3r

8

在問候西拉斯帕克的回答,Qt文檔說,這對aboutToQuit信號:

的信號是,如果你的應用程序必須做的特別有用一些 最後一次清理。請注意,此 狀態中不可能有用戶交互。

如果你希望你的應用程序能夠取消退出進程或允許用戶在應用程序關閉之前進行最後一分鐘的變化,那麼你可以通過在MainWindow處理closeEvent功能做到這一點。

void MainWindow::closeEvent(QCloseEvent *event) 
{ 
    if (maybeSave()) { 
     writeSettings(); 
     event->accept(); 
    } else { 
     event->ignore(); 
    } 
} 

有關更多信息,請參閱closeEvent文檔。

+0

如何在QApplication而不是QMainWIndow中處理? – prakashpun

+1

@ pra16'QApplication'並不真正具有'closeEvent'的必然結果。您可以嘗試使用['lastWindowClosed'](http://doc.qt.io/qt-5/qguiapplication.html#lastWindowClosed)或使用信號處理來中斷暫停/關閉信號。 –