zoukankan      html  css  js  c++  java
  • Qt窗口退出与事件循环退出的问题

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

  • 相关阅读:
    (转)Xargs用法详解
    (转)运维老鸟教你安装centos6.5如何选择安装包
    (转)正则表达式与三剑客的使用技巧
    php OAuth服务端编写
    前端工程精粹(一):静态资源版本更新与缓存
    静态资源打包:一个javescript 的src引用多个文件,一个link引用多个CSS文件
    ie,cookie,域名与下划线
    HTML中css和js链接中的版本号
    PHP 优化详解
    jqury插件编写
  • 原文地址:https://www.cnblogs.com/MakeView660/p/11775380.html
Copyright © 2011-2022 走看看