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

  • 相关阅读:
    MFC中 CListCtrl控件的使用及定位、选中
    在VC++6.0中,编译,调试都能通过,但运行到某一步的时候就报错的可能原因。
    存储IplImage结构体到STL中的vector中的问题
    VS工程,换电脑后出现的问题
    What is a Full Stack developer?
    [MB855]变砖解决
    ERP 开发过程中涉及到的算法 库存,工程,生产计划,固定资产计算方法
    定义枚举类型带有byte 的作用
    构造函数带有this和base的作用
    创建一个简单的WCF程序(转载)
  • 原文地址:https://www.cnblogs.com/MakeView660/p/11775380.html
Copyright © 2011-2022 走看看