最近项目有个要求,就是发送文件到服务器上面,然后要在程序里面等待服务器返回的数据,根据返回的信息决定继续发还是断开。本来想用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的简单使用(二)相关推荐

  1. autocad2007二维图画法_cad怎样绘制简单的二维图形

    CAD绘制二维图形非常的简单,大家经常用它来画图,下面是学习啦小编带来关于cad怎样绘制简单的二维图形的内容,希望可以让大家有所收获! cad绘制简单二维图形的方法 1.绘图菜单绘图菜单是绘制图形最基 ...

  2. Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5个样本)——概率预测

    Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5个样本)--概率预测 目录 输出结果 核心代码 输出结果 核心代码 # -*- coding: ...

  3. Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5+1个样本)——类别预测

    Keras之ML~P:基于Keras中建立的简单的二分类问题的神经网络模型(根据200个数据样本预测新的5+1个样本)--类别预测 目录 输出结果 核心代码 输出结果 核心代码 # -*- codin ...

  4. Redis简单案例(二) 网站最近的访问用户

    原文:Redis简单案例(二) 网站最近的访问用户 我们有时会在网站中看到最后的访问用户.最近的活跃用户等等诸如此类的一些信息.本文就以最后的访问用户为例, 用Redis来实现这个小功能.在这之前,我 ...

  5. QEventLoop的简单使用(一)

    1.一般我们的事件循环都是由exec()来开启的,例如下面的例子: QCoreApplicaton::exec()QApplication::exec()QDialog::exec()QThread: ...

  6. java爬虫之基于httpclient的简单Demo(二)

    转载自 java爬虫之基于httpclient的简单Demo(二) 延续demo1的 java爬虫的2种爬取方式(HTTP||Socket)简单Demo(一),demo2出炉啦,大家想学爬虫都可以从这 ...

  7. WebSocket简单使用(二) - 客户端

    WebSocket简单使用(二) - 客户端 原文 http://www.oseye.net/user/kevin/blog/79 关于WebSocket我打算分如下几篇博文来探探路: WebSock ...

  8. iOS开发UI篇—Quartz2D简单使用(二)

    iOS开发UI篇-Quartz2D简单使用(二) 一.画文字 代码: // // YYtextview.m // 04-写文字 // // Created by 孔医己 on 14-6-10. // ...

  9. Akka Remote Actor_简单示例二

    2019独角兽企业重金招聘Python工程师标准>>> Akka Remote Actor_简单示例二 在上一篇文章中,http://my.oschina.net/xinxingeg ...

  10. mysql使用简单教程_Mysql使用简单教程(二)_MySQL

    接上文Linux系统下Mysql使用简单教程(一) 字段参数以"(字段名1 数据类型1,字段名2 数据类型2,......)"的形式构建. 关于mysql常用的数据类型,一下是比较 ...

最新文章

  1. Forefront_TMG_2010-TMG建立Remote ***
  2. spring核心:bean工厂的装配 6
  3. Android实战:手把手实现“捧腹网”APP(三)-----UI实现,逻辑实现
  4. 19 删除链表的倒数第N个
  5. WinPcap笔记(5):不用回调方法捕获数据包
  6. 项目管理学习总结(14)——优秀技术Leader应该具备什么哪些方面的能力
  7. QC在windows7远程执行QTP脚本无法读excel解决方案
  8. android 9.0 c7Pro,三星c7pro和vivo x9哪个好?三星Galaxy c7 pro和vivo x9区别对比评测
  9. 5个必考的大厂SQL面试题
  10. java beanshell_jmeter进阶之Beanshell引用Java代码
  11. 《三天三夜》创作者去世,曾一边写歌一边编程
  12. 关于linux校准时间
  13. JS模块化-实现一个简单的CommonJS
  14. 微信世界争霸服务器,微信世界争霸小程序进不去游戏怎么办
  15. 地牢大师--(BFS+三维数组)
  16. win7系统无法开启telnet服务器,Win7系统开启telnet客户端解决无法使用命令问题
  17. 详细Http状态查询返回 HTTP 状态代码以响应请求
  18. pytorch教程(1.5)——梯度自动计算
  19. 台式计算机m4350,比超极本便携 评联想M4350q小型台式机
  20. sql语句insert插入函数如果values值括号里放变量名

热门文章

  1. 一文带你学C语言,详细知识点思维导图!
  2. c与python 数据传递-详解python如何调用C/C++底层库与互相传值
  3. 千本樱计算机音乐谱,【C型】我来发几个谱子 【千本樱】【权御天下】
  4. oracle从入门到精通_【论文】基于SPSS Modeler和Oracle的学生行为数据分析
  5. magento网站建设_外贸网站建设指南,告诉你建站系统怎么选择
  6. Python学习6——条件,循环语句
  7. 如何让博客变得稍稍好看
  8. MySQL存储引擎InnoDB,MyISAM
  9. 使用iperf进行设备吞吐量测试
  10. 黄聪:CodeSmith和PowerDesigner的使用安装和数据库创建(原创系列教程)