美文网首页
Qt为自己的程序建立一个消息循环

Qt为自己的程序建立一个消息循环

作者: Joe_HUST | 来源:发表于2017-12-03 23:10 被阅读0次
  • 一般事件循环都是由exec()来开启的,如:
QCoreApplicaton::exec()
QApplication::exec()
QDialog::exec()
QThread::exec()
QDrag::exec()
QMenu::exec()
  • 事件循环是一个无限循环,程序在exec()里面无限循环,能让跟在exec()后面的代码得不到运行的机会,直到exec()跳出。从exec()中跳出时,事件循环会被终止。QEventLoop::quit()能够终止事件循环。事件循环实际上类似于一个事件队列,对列入的事件依次的进行处理,当时间做完而事件循环没有结束的时候,其实际上比较类似于一个不占用CPU事件的for(;;)循环。
  • 事件循环是可以嵌套的,当在子事件循环中的时候,父事件循环中的事件实际上是处于中断的状态,当子循环跳出exec()之后才可以执行父循环中的事件。但是此时并不代表父循环中的界面响应会被中断,因为往往子循环中也会有父循环的大部分事件,执行QMessageBox::exec(),QEventLoop::exec()的时候,虽然这些exec()打断了main函数中的QApplication::exec(),但是由于GUI界面的响应已经被包含在子循环当中,所以GUI界面依然能够得到响应。
  • 如果某一个子事件的循环仍然有效,但是其父循环被强制跳出,此时父循环不会立即执行跳出,而是等待子事件循环跳出后,父循环才会跳出。

如果希望将主线程等待100ms,不能使用sleep来完成这个过程,那样会导致GUI界面停止响应。但是利用事件循环就可以避免这一点:

QEventLoop loop;
QTimer::singleShot(100,&loop,SLOT(quit()));
loop.exec();

若在一个槽函数中创建一个对象如下:

void myDialog:: on_pushButton_clicked()
{
  QDialog dlg;
  dlg.show();
}

此时我们会看不到dlg窗口或者是看到窗口一闪而过。因为我们的dlg会因为出了作用域而被析构掉。解决的办法很简单。

  1. 将 dlg 作为类的成员,而不是函数的局部变量
  2. 将 dlg 前添加static作为静态成员
  3. 将 dlg 用new分配到heap当中
  4. 使用事件循环
void myDialog::on_pushButton_clicked()
{
  QDialog tDlg;
  tDlg.show();
  QEventLoop tloop;
  connect(&tDlg,SIGNAL(finished(int)),&tloop,SLOT(quit()));
  tloop.exec(QEventLoop::AllEvents);
}

相关文章

  • Qt为自己的程序建立一个消息循环

    一般事件循环都是由exec()来开启的,如: 事件循环是一个无限循环,程序在exec()里面无限循环,能让跟在ex...

  • 2020-11-20 Qt事件循环

    一 Qt事件循环:从队列中不断取出消息、处理消息的过程。 Qt会接管windows的原生窗口消息,翻译成Qt消息,...

  • C++框架 之Qt的一系列注意细节

    1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术...

  • Qt5.8 (2).Java与Qt通信之TCP图片传输

    Java-Qt-TCP数据传输 程序描述 使用Qt建立TCP Server,用Java建立TCP Client,C...

  • Ubuntu18.04下使用linuxdeployqt对QT5项

    前言 此方法适用于对自己建立的QT项目进行打包,Ubuntu环境为18.04,使用QT Creator4.12.3...

  • Android应用程序线程的消息循环模型

    Android应用程序线程的消息循环模型 Android应用程序线程的三种消息循环模型:应用程序主线程消息循环模型...

  • Qt开发环境搭建(win10)

    Qt开发环境 1.介绍 Qt是一个跨平台的C++图形用户界面应用程序框架,提供给应用程序开发者建立艺术级的图形用户...

  • ubuntu发布qt程序

    一个简单的QT程序 一个简单的程序,并没有列出pro文件,目录为helloworld。 #include #in...

  • Qt的信号和槽

    信号和槽是Qt特有的信息传输驱动机制,是Qt程序设计中的重要基础,它可以让程序员在互不相干的对象之间建立联系。槽本...

  • 一个 Qt 事件对象的旅行

    Qt 的事件来自操作系统,Qt自己产生。当Qt应用程序运行时,qt有一个未处理的事件队列,每个事件处理周期内,将处...

网友评论

      本文标题:Qt为自己的程序建立一个消息循环

      本文链接:https://www.haomeiwen.com/subject/wrkzbxtx.html