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
QEventLoop的简单使用(二)相关推荐
- autocad2007二维图画法_cad怎样绘制简单的二维图形
CAD绘制二维图形非常的简单,大家经常用它来画图,下面是学习啦小编带来关于cad怎样绘制简单的二维图形的内容,希望可以让大家有所收获! cad绘制简单二维图形的方法 1.绘图菜单绘图菜单是绘制图形最基 ...
- Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5个样本)——概率预测
Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5个样本)--概率预测 目录 输出结果 核心代码 输出结果 核心代码 # -*- coding: ...
- Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5+1个样本)——类别预测
Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5+1个样本)--类别预测 目录 输出结果 核心代码 输出结果 核心代码 # -*- codin ...
- Redis简单案例(二) 网站最近的访问用户
原文:Redis简单案例(二) 网站最近的访问用户 我们有时会在网站中看到最后的访问用户.最近的活跃用户等等诸如此类的一些信息.本文就以最后的访问用户为例, 用Redis来实现这个小功能.在这之前,我 ...
- QEventLoop的简单使用(一)
1.一般我们的事件循环都是由exec()来开启的,例如下面的例子: QCoreApplicaton::exec()QApplication::exec()QDialog::exec()QThread: ...
- java爬虫之基于httpclient的简单Demo(二)
转载自 java爬虫之基于httpclient的简单Demo(二) 延续demo1的 java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一),demo2出炉啦,大家想学爬虫都可以从这 ...
- WebSocket简单使用(二) - 客户端
WebSocket简单使用(二) - 客户端 原文 http://www.oseye.net/user/kevin/blog/79 关于WebSocket我打算分如下几篇博文来探探路: WebSock ...
- iOS开发UI篇—Quartz2D简单使用(二)
iOS开发UI篇-Quartz2D简单使用(二) 一.画文字 代码: // // YYtextview.m // 04-写文字 // // Created by 孔医己 on 14-6-10. // ...
- Akka Remote Actor_简单示例二
2019独角兽企业重金招聘Python工程师标准>>> Akka Remote Actor_简单示例二 在上一篇文章中,http://my.oschina.net/xinxingeg ...
- mysql使用简单教程_Mysql使用简单教程(二)_MySQL
接上文Linux系统下Mysql使用简单教程(一) 字段参数以"(字段名1 数据类型1,字段名2 数据类型2,......)"的形式构建. 关于mysql常用的数据类型,一下是比较 ...
最新文章
- Forefront_TMG_2010-TMG建立Remote ***
- spring核心:bean工厂的装配 6
- Android实战:手把手实现“捧腹网”APP(三)-----UI实现,逻辑实现
- 19 删除链表的倒数第N个
- WinPcap笔记(5):不用回调方法捕获数据包
- 项目管理学习总结(14)——优秀技术Leader应该具备什么哪些方面的能力
- QC在windows7远程执行QTP脚本无法读excel解决方案
- android 9.0 c7Pro,三星c7pro和vivo x9哪个好?三星Galaxy c7 pro和vivo x9区别对比评测
- 5个必考的大厂SQL面试题
- java beanshell_jmeter进阶之Beanshell引用Java代码
- 《三天三夜》创作者去世,曾一边写歌一边编程
- 关于linux校准时间
- JS模块化-实现一个简单的CommonJS
- 微信世界争霸服务器,微信世界争霸小程序进不去游戏怎么办
- 地牢大师--(BFS+三维数组)
- win7系统无法开启telnet服务器,Win7系统开启telnet客户端解决无法使用命令问题
- 详细Http状态查询返回 HTTP 状态代码以响应请求
- pytorch教程(1.5)——梯度自动计算
- 台式计算机m4350,比超极本便携 评联想M4350q小型台式机
- sql语句insert插入函数如果values值括号里放变量名
热门文章
- 一文带你学C语言,详细知识点思维导图!
- c与python 数据传递-详解python如何调用C/C++底层库与互相传值
- 千本樱计算机音乐谱,【C型】我来发几个谱子 【千本樱】【权御天下】
- oracle从入门到精通_【论文】基于SPSS Modeler和Oracle的学生行为数据分析
- magento网站建设_外贸网站建设指南,告诉你建站系统怎么选择
- Python学习6——条件,循环语句
- 如何让博客变得稍稍好看
- MySQL存储引擎InnoDB,MyISAM
- 使用iperf进行设备吞吐量测试
- 黄聪:CodeSmith和PowerDesigner的使用安装和数据库创建(原创系列教程)