目錄
問題背景:
aboutToQuit
代碼舉例
closeEvent事件
代碼舉例
程序退出方式
quit()
?exit(int returnCode = 0)
?close()
問題背景:
?????????實際項目中程序退出前往往需要及進行一些資源釋放、配置保存、線程中斷等操作,避免資源浪費,配置參數丟失等;但是Qt程序默認的退出方式并不能釋放主動申請的這些資源,因此在程序關退出前需要主動進行資源回收和記錄退出方式等。
aboutToQuit
????????aboutToQuit信號是QCoreApplication類的一個信號,它在應用程序即將退出時發出。這個信號對于在應用程序關閉前執行一些清理工作非常有用,比如保存設置、釋放資源等。 使用場景:通常連接到一個槽函數,用于處理應用程序退出前的清理工作。
代碼舉例
通過連接?aboutToQuit信號到資源釋放槽函數,從而達到在程序退出前進行資源釋放操作。
int main(int argc, char *argv[])
{QApplication a(argc, argv);THWritterTool w;w.show();QObject::connect(qApp, &QCoreApplication::aboutToQuit, [&]() {cLogger("THWritterTool")->info("THWritterTool程序正常退出!");w.Destroy();ReleaseResource();});int ret = a.exec();//在事件循環結束后進行一些資源釋放 一些非正常退出無aboutToQuit信號releaseResource();return ret;
}
closeEvent事件
????????closeEvent是QWidget類的一個事件處理函數,當窗口關閉時,Qt會調用這個函數。通過重寫主界面的這個函數可在窗口關閉前執行一些自定義的操作,比如詢問用戶是否真的要關閉窗口,或者保存未保存的數據。?
代碼舉例
void THWritterTool::closeEvent(QCloseEvent * event)
{if (!m_AuthorithyVertify){QTHMessageBox::TimerMessage(this, QMessageBox::Critical, QObject::tr("授權未驗證通過,程序即將退出!"), 15 * 1000);cLogger("THWritterTool")->info("授權未驗證通過退出");}else if (m_switchDB){QTHMessageBox::TimerMessage(this, QTHMessageBox::Critical, QObject::tr("數據庫已切換,程序即將退出!"), 15 * 1000);cLogger("THWritterTool")->info("切換數據庫程序退出");}else{if (m_savingCfg){QTHMessageBox::TimerMessage(this, QTHMessageBox::Warning, QObject::tr("正在保存配置文件,無法退出。"), 15 * 1000);event->ignore();//忽略退出事件return;}ret = QTHMessageBox::question(this, tr("是否要退出程序?"), QTHMessageBox::Yes | QTHMessageBox::No);if (ret == QTHMessageBox::Yes){cLogger("THWritterTool")->info("用戶手動確認退出");}}cLogger("THWritterTool")->info("正常退出");g_pTHSplashScreen->show();//啟動畫面qApp->processEvents();//保證退出時候展示啟動畫面事件可運行 避免卡死Destroy();event->accept();//接收事件 不在傳遞
}
程序退出方式
quit()
? ? ? ? quit()是QCoreApplication類(以及繼承自它的QApplication類)的一個靜態函數,用于退出整個Qt應用程序。
? ? ? ? 當調用quit()時,它會退出主事件循環,觸發QApplication::exec()返回,并關閉所有打開的窗口。程序會完全終止。
? ? ? ? quit()通常用于在應用程序中實現“退出”功能,比如在菜單項的“退出”操作上綁定這個函數。
? ? ? ? quit()作為槽函數,也可以連接信號和槽,響應某個信號后關閉應用程序。
?? ? ?
?? ? ?? 調用quit后程序在退出前會觸發aboutToQuit信號
?exit(int returnCode = 0)
? ? ? ? exit()和quit()類似,也是用于退出應用程序。
? ? ? ? exit()可以指定一個返回代碼(returnCode),該代碼將在應用程序退出時返回給操作系統。
? ? ? ? 它同樣會結束主事件循環并關閉所有窗口。
? ? ? ? exit()更適合在需要返回特定退出代碼的場景中使用。
?? ? ?
?? ? ?? 調用exit后程序在退出前會觸發aboutToQuit信號
?close()
? ? ? ? close()是QWidget類的成員函數,用于關閉單個窗口或控件。
? ? ? ? 調用close()會嘗試關閉該窗口或控件,關閉前會觸發closeEvent()事件。如果該窗口是主窗口,且所有子窗口都已關閉,應用程序會退出,退出前會觸發和aboutToQuit信號。
? ? ? ? close()適用于關閉單個窗口或控件的場景,比如“關閉”按鈕的操作。
? ? ? ? 當用戶點擊窗口右上角的“X”按鈕時,系統也會自動調用該窗口的close()函數。
?? ? ?