关于Qt的事件循环以及QEventLoop的简单使用
来源:互联网 发布:java基础 学javascript 编辑:程序博客网 时间:2024/05/18 00:34
http://www.cnblogs.com/-wang-cheng/p/4973021.html
1.一般我们的事件循环都是由exec()来开启的,例如下面的例子:
1 QCoreApplicaton::exec()2 QApplication::exec()3 QDialog::exec()4 QThread::exec()5 QDrag::exec()6 QMenu::exec()
这些都开启了事件循环,事件循环首先是一个无限“循环”,程序在exec()里面无限循环,能让跟在exec()后面的代码得不到运行机会,直至程序从exec()跳出。从exec()跳出时,事件循环即被终止。QEventLoop::quit()能够终止事件循环。
事件循环实际上类似于一个事件队列,对列入的事件依次的进行处理,当时间做完而时间循环没有结束的时候,其实际上比较类似于一个不占用CPU事件的for(;;)循环。
其本质实际上是以队列的方式来重新分配时间片。
2.事件循环是可以嵌套的,当在子事件循环中的时候,父事件循环中的事件实际上处于中断状态,当子循环跳出exec之后才可以执行父循环中的事件。当然,这不代表在执行子循环的时候,类似父循环中的界面响应会被中断,因为往往子循环中也会有父循环的大部分事件,执行QMessageBox::exec(),QEventLoop::exec()的时候,虽然这些exec()打断了main()中的QApplication::exec(),但是由于GUI界面的响应已经被包含到子循环中了,所以GUI界面依然能够得到响应。
3.如果某个子事件循环仍然有效,但其父循环被强制跳出,此时父循环不会立即执行跳出,而是等待子事件循环跳出后,父循环才会跳出
举几个例子吧,比如说如果想要将主线程等待100ms,总不能使用sleep吧,那样会导致GUI界面停止响应的,但是用事件循环就可以避免这一点:
1 QEventLoop loop;2 QTimer::singleShot(100, &loop, SLOT(quit()));3 loop.exec();
还有,比如说对于一个槽函数,触发之后会弹出一个dialog,但是像下面这样写的话,窗口会一闪而过的:
1 void ****::mySLot{2 QDialog dlg;3 dlg.show();4 }
当然这里可以使用将dlg改成一个静态成员,通过增长期生存期的方法来解决这个问题,但是这里同样可以使用eventLoop来解决这个问题:
1 void ****::mySLot{2 QDialog dlg;3 dlg.show();4 QEventLoop loop;5 connect(&dlg, SIGNAL(finished(int)), &loop, SLOT(quit()));6 loop.exec(QEventLoop::ExcludeUserInputEvents);7 }
- 关于Qt的事件循环以及QEventLoop的简单使用
- Qt QEventLoop 的使用两例
- Qt 事件与循环,和QEventLoop
- 关于Qt的事件循环以及状态机事件循环的思考
- QEventLoop 的使用两例
- QEventLoop 的使用两例
- QEventLoop 的使用两例
- QEventLoop 的使用两例
- QEventLoop 的使用两例
- QEventLoop 的使用两例
- QEventLoop 的使用两例
- QEventLoop 的使用两例
- QEventLoop 的使用两例
- 【转】QEventLoop 的使用两例
- 【转】QEventLoop 的使用两例
- Qt事件循环、IO、基于libev的Qt事件循环
- qt模态对话框 以及exec()事件循环简单实现
- Qt使用非阻塞事件循环的延时方式
- 最全前端资源---快过来 最新鲜的资源这里都有
- YUV422P、YV16、NV16、NV61格式转换成RGB24
- jsvm9.19.7运行步骤
- tomcat过一段时间就报spring的错:BeanFactory not initialized or already closed - call 'refr
- Angular之ng-repeat批量生产组件
- 关于Qt的事件循环以及QEventLoop的简单使用
- iOS TableView滚动到最底部
- NestedScrolling 嵌套滑动机制:原理简单分析(二)
- C#预处理器指令
- U盘不能卸载,直接拔掉再插入提示:“目录损坏
- body{display:none}
- 内核新的ioctl方式---- unlocked_ioctl和compat_ioctl
- Android开发---加载h5界面
- 如何对java多源文件编译