我在Qt主程序中開啟一個線程,線程中使用信號-槽來產生QMainWindow(GUI),main函數代碼如下:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
NetWorkThread thread;
thread.start();
// 進入事件循環
return a.exec();
}
對於生成的QMainWindow,我全部手動關閉后,再想發送信號來創建,就無法創建出來了~
加斷點調試起來看,此時信號-槽好像斷開了,於是查了好多信號槽調試方面的內容,但是無所收獲。
最后查找資料,是應用程序的事件循環直接退出了!
事件循環實際上類似於一個事件隊列,對列入的事件(或信號)依次的進行處理,當事件做完而時間循環沒有結束的時候,其實際上比較類似於一個不占用CPU事件的for(;;)循環。本質實際上是以隊列的方式來重新分配時間片,有了它,信號發生,事件產生才能正常進行。
因為main函數中沒有主GUI窗口(類似於一個服務程序),當前程序的GUI窗口是通過信號-槽動態產生的,產生的QMainWindow就充當了主窗口了!
但是Qt對於窗口關閉事件有如下默認的操作:
窗口屬性:Qt::WA_QuitOnClose
解釋:Makes Qt quit the application when the last widget with the attribute set has accepted closeEvent(). This behavior can be modified with the QApplication::quitOnLastWindowClosed property. By default this attribute is set for all widgets of type Qt::Window.
主窗口默認設置為Qt::WA_QuitOnClose,即當主窗口關閉時,主事件循環也退出了,此時信號發生、事件產生就得不到響應了~
修改方法:
1、去掉窗口的Qt::WA_QuitOnClose屬性
2、或通過QGuiApplication::setQuitOnLastWindowClosed(false)來設定
比較方便的修改如下:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
NetWorkThread thread;
thread.start();
// 確保事件循環在最后一個窗口關閉后不退出
a.setQuitOnLastWindowClosed(false);
// 進入事件循環
return a.exec();
}
這樣的話,主事件循環就不會退出,類似於作為一個常駐的服務進程存在了~
如果想退出的話,可以發送quit()信號等來強制退出即可。