Qt/QEventLoop的使用
最近项目有个要求,就是发送文件到服务器上面,然后要在程序里面等待服务器返回的数据,根据返回的信息决定继续发还是断开。本来想用while在那里等待,可是发现不行,界面卡住了。百度下,发现可以用QEventLoop来实现这个功能。
我简单说下QEventLoop的使用,更加具体详细的使用,大家可以参考官方文档或者其他文献。
这里的意思是说QEventLoop类为我们提供了一种进入和退出一个事件循环的方法。在任何时候,你都可以创建一个QEventLoop实例,然后调用exec()来启动一个事件循环,在这个循环期间,可以调用exit()来强制使exct()返回。
事件循环是一个无限“循环”,当调用事件的exec()的时候,程序就会在exec()里面无限循环,让在exec()后面的程序得不到运行的机会,除非程序从exec()里面跳出来。
来啦,划重点了。子层事件循环具有父层事件循环的所有功能,所以当在主线程中启动各种exec()(比如QEventLoop::exec())时,虽然会打断main函数中的QApplication::exec(),但是Gui界面还是可以正常响应,不会出现卡住的现象。这与用while来循环是不一样的。
下面介绍下使用的方法,其实使用很简单
(1)实例化
QEventLoop loop;
(2)启动事件循环
- //以上省略了部分代码,这是使用HTTP中的post来发送文件到服务器
- QNetworkReply *postReply = m_pNetManager->post(request, qbt); //post方式到本地服务器
- connect(postReply, SIGNAL(finished()), this, SLOT(postFileReplyFinished())); //成功后会有返回响应
- loop->exec(); //设置等待,若文件成功发送,则退出等待
(3)在其他的响应函数中退出循环
- void Widget::postFileReplyFinished()
- {
- QNetworkReply* reply = (QNetworkReply*)sender();
- QByteArray replyData = reply->readAll();
- //转为JSon格式,便于提取字段数据
- QJsonDocument jsonDoc= QJsonDocument::fromJson(replyData);
- if(!jsonDoc.isNull())
- {
- QJsonObject jsonObj = jsonDoc.object(); //转换格式
- if(jsonObj.contains("status"))
- {
- loop->exit(); //loop退出等待
- }
- }
- }
我实现的功能是,发送文件后,就进入事件循环,当接收到返回的json数据后,判断数据是否正确,正确的话就退出事件循环。
其实还有一种方法来实现事件循环的退出。就是使用QT中的信号与槽的机制,在初始化的时候,将 reply的响应与loop的quit连接起来。
- QEventLoop loop;
- qManager = new QNetworkAccessManager(this);
- QNetworkRequest request;
- request.setUrl(QUrl("http://localhost/public/index/file/upload"));
- QNetworkReply *reply = qManager->get(request);
- connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
- loop.exec();
这样的话就更简洁了。可是有个问题就是,一收到reply就退出事件的循环,如果想要判断一下还是用前面的方法比较好。
参考文献:
http://doc.qt.io/archives/qt-4.8/qeventloop.html
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29650836&id=4471683
http://blog.chinaunix.net/uid-27685749-id-3847998.html
Qt/QEventLoop的使用相关推荐
- 关于Qt的事件循环以及QEventLoop的简单使用
1.一般我们的事件循环都是由exec()来开启的,例如下面的例子: 1 QCoreApplicaton::exec() 2 QApplication::exec() 3 QDialog::exec() ...
- 【Qt】一个使用QEventLoop时,遇到的教训
1.问题描述 伪代码如下: QEventLoop eventLoop; QObject::connect(this, &Class::signal, [](){doSomething();ev ...
- Qt开启本地事件循环(防止界面卡阻塞【卡死】)QEventLoop 的基本使用
刚刚看别人的源码,发现大佬都是这么玩的 当要使用延时,又不想卡死界面时,就开启本地事件循环: 官方给出的说明如下: 记得,上次我写的那个狩猎者项目,用了一个记时器去判断,low得一逼. 可以开一个本地 ...
- 11.QT事件机制源码时序分析(下)
接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109182406,本文继续解析QCoreApplication::sendEvent和Q ...
- 10.QT事件机制源码时序分析(中)
接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109162220,上篇文章已经说过,在Ubuntu18.04,QT的事件机制实际上是采用 ...
- 9.QT事件机制源码时序分析(上)
通过上两篇博客https://blog.csdn.net/Master_Cui/article/details/109093845和https://blog.csdn.net/Master_Cui/a ...
- 8.QT的事件循环与事件发送相关类
一.QT的事件发送类QCoreApplication QT使用QCoreApplication类为Qt程序提供了事件循环机制.该类继承QObject.QCoreApplication包含主事件循环,来 ...
- 乱谈Qt事件循环嵌套
本文旨在说明:QDialog::exec().QMenu::exec()等开启的局部事件循环,易用的背后,还有很多的陷阱... 引子 Qt 是事件驱动的,基本上,每一个Qt程序我们都会通过QCoreA ...
- QT开发(十二)——QT事件处理机制
一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 ...
最新文章
- python扫描端口脚本_Python实现的端口扫描功能示例
- kubernetes log 流式数据处理
- ProEssentials实时三维图表控件
- java tail -f 后返回_tail -f 的实现 | 学步园
- Docker生成镜像的两种方式
- 51nod---无法表示的数
- grub shell 错误_使用grub-install修复Grub时出错
- 乐高ev3涉及到的一些赛事_使您成为英雄的前五名开发者技能(提示:涉及LEGO)
- c++语言while循环,c++ c语言while 循环语句入门基础教程
- Golang笔记——方法
- Eclipse使用SVN操作说明
- 阅读《C陷阱与缺陷》的知识增量
- 介绍一下关于Spring Cloud Stream
- php2个栈写一个队列,【数据结构】栈面试题--两个栈实现一个队列
- 笑话(12) 内裤都磨破了
- C语言常见编程题及答案40题
- angularjs select 下拉加载option 默认选中第一行为空格的解决办法
- ArcMap客户端——将shp属性表导出为excel
- 软件工程师核心竞争力有那些
- 转:使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制