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

Qt窗口退出与事件循环退出的问题的更多相关文章

  1. Qt 的线程与事件循环

    Qt 的线程与事件循环

  2. Qt 的线程与事件循环——可打印threadid进行观察槽函数到底是在哪个线程里执行,学习moveToThread的使用)

    周末天冷,索性把电脑抱到床上上网,这几天看了 dbzhang800 博客关于 Qt 事件循环的几篇 Blog,发现自己对 Qt 的事件循环有不少误解.从来只看到现象,这次借 dbzhang800 的博 ...

  3. 优雅的退出asyncio事件循环

    import asyncio import functools import os import signal """ 信号值 符号 行为 2 SIGINT 进程终端,C ...

  4. Qt 学习之路:线程和事件循环

    前面一章我们简单介绍了如何使用QThread实现线程.现在我们开始详细介绍如何“正确”编写多线程程序.我们这里的大部分内容来自于Qt的一篇Wiki文档,有兴趣的童鞋可以去看原文. 在介绍在以前,我们要 ...

  5. QT中的线程与事件循环理解(1)

    1.需要使用多线程管理的例子 一个进程可以有一个或更多线程同时运行.线程可以看做是“轻量级进程”,进程完全由操作系统管理,线程即可以由操作系统管理,也可以由应用程序管理.Qt 使用QThread 来管 ...

  6. Qt ------ 再论事件循环

    在介绍在以前,我们要认识两个术语: 可重入的(Reentrant):如果多个线程可以在同一时刻调用一个类的所有函数,并且保证每一次函数调用都引用一个唯一的数据,就称这个类是可重入的(Reentrant ...

  7. Qt 学习之路 2(72):线程和事件循环

    Qt 学习之路 2(72):线程和事件循环 <理解不清晰,不透彻>  --  有需求的话还需要进行专题学习  豆子  2013年11月24日  Qt 学习之路 2  34条评论 前面一章我 ...

  8. 【Qt开发】事件循环与线程 一

    事件循环与线程 一 初次读到这篇文章,译者感觉如沐春风,深刻体会到原文作者是花了很大功夫来写这篇文章的,文章深入浅出,相信仔细读完原文或下面译文的读者一定会有收获. 由于原文很长,原文作者的行文思路是 ...

  9. Qt经典—线程、事件与Qobject(耳目一新)

    介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...

随机推荐

  1. selenium设置谷歌无头浏览器

    from selenium import webdriver from selenium.webdriver.chrome.options import Options def Browse(): c ...

  2. Java注解简单学习

    注解(也被称作元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们在稍后某个时刻可以很方便的使用这些数据,其在一定程度上将元数据与源代码文件结合在一起,而不是保存在外部文档中. 注解使我们可以 ...

  3. 微信两种签名算法MD5和HMAC-SHA256

    在做微信接口开发的过程中, 有时候发现会提示签名校验失败, 一模一样的签名逻辑就是有些接口跑步通, 找了一圈发现挺坑的; 原来是有些接口的signType签名类型有区别, 有些接口signType要求 ...

  4. PHP匿名函数、闭包、function use

    匿名函数,也叫闭包函数(closures) ,允许临时创建一个没有制定名称的函数.最常用作回调函数(callback)参数的值. 闭包函数也可以作为变量的值来使用.PHP将会自动把此种表达式转换成内置 ...

  5. window2012安装oracle报INS-13001 环境不满足最低要求

    在windows server 2012R2安装Oracle客户端或者服务端时,会弹窗报错INS-13001 环境不满足最低要求此时可以进行以下操作进行解决 在解压后的Oracle安装文件目录中,找到 ...

  6. 10g+: Transportable Tablespaces Across Different Platforms (Doc ID 243304.1)

    10g+: Transportable Tablespaces Across Different Platforms (Doc ID 243304.1) APPLIES TO: Oracle Data ...

  7. python类属性 静态方法

      实例 实例就是由对象创建出来的实实在在的存在 创建出来的对象叫做类的实例 创建对象的动作叫做实例化 对象的属性叫做实例的属性 对象调用的方法叫做实例方法   类是一个特殊的对象   类属性 类属性 ...

  8. 201871010115-马北《面向对象程序设计(java)》第一周学习总结

    博文正文开头格式:(3分) 项目 内容 这个作业属于哪个课程 <https://www.cnblogs.com/nwnu-daizh/> 这个作业的要求在哪里 <https://ww ...

  9. AcWing 28. 在O(1)时间删除链表结点

    地址 https://www.acwing.com/problem/content/description/85/ 题目描述给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点. 假设链表 ...

  10. A1060 Are They Equal (25 分)

    一.技术总结 cnta.cntb用于记录小数点出现的位置下标,初始化为strlen(字符串)长度. q.p用于记录第一个非0(非小数点)出现的下标,可以用于计算次方和方便统计输出的字符串,考虑到前面可 ...