我在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()信号等来强制退出即可。