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

  • 相关阅读:
    November 13th 2016 Week 47th Sunday The 1st Day
    November 12th 2016 Week 46th Saturday
    November 11th 2016 Week 46th Friday
    November 10th 2016 Week 46th Thursday
    November 9th 2016 Week 46th Wednesday
    November 8th 2016 Week 46th Tuesday
    windows 7文件共享方法
    Win7无线网络共享设置方法
    常量指针和指针常量
    如何查找局域网的外网ip
  • 原文地址:https://www.cnblogs.com/MakeView660/p/11775380.html
Copyright © 2011-2022 走看看