Qt窗口退出與事件循環退出的問題

我在Qt主程序中開啓一個線程,線程中使用信號-槽來產生QMainWindow(GUI),main函數代碼以下:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);app

NetWorkThread thread;
thread.start();函數

// 進入事件循環
return a.exec();
}ui

對於生成的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,即當主窗口關閉時,主事件循環也退出了,此時信號發生、事件產生就得不到響應了~
修改方法:
一、去掉窗口的Qt::WA_QuitOnClose屬性
二、或經過QGuiApplication::setQuitOnLastWindowClosed(false)來設定this

比較方便的修改以下:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);spa

NetWorkThread thread;
thread.start();線程

// 確保事件循環在最後一個窗口關閉後不退出
a.setQuitOnLastWindowClosed(false);

// 進入事件循環
return a.exec();
}調試

這樣的話,主事件循環就不會退出,相似於做爲一個常駐的服務進程存在了~
若是想退出的話,能夠發送quit()信號等來強制退出便可。隊列

相關文章
相關標籤/搜索