最近项目有个要求,就是发送文件到服务器上面,然后要在程序里面等待服务器返回的数据,根据返回的信息决定继续发还是断开。本来想用while在那里等待,可是发现不行,界面卡住了。百度下,发现可以用QEventLoop来实现这个功能。

我简单说下QEventLoop的使用,更加具体详细的使用,大家可以参考官方文档或者其他文献。

这里的意思是说QEventLoop类为我们提供了一种进入和退出一个事件循环的方法。在任何时候,你都可以创建一个QEventLoop实例,然后调用exec()来启动一个事件循环,在这个循环期间,可以调用exit()来强制使exct()返回。

事件循环是一个无限“循环”,当调用事件的exec()的时候,程序就会在exec()里面无限循环,让在exec()后面的程序得不到运行的机会,除非程序从exec()里面跳出来。

来啦,划重点了。子层事件循环具有父层事件循环的所有功能,所以当在主线程中启动各种exec()(比如QEventLoop::exec())时,虽然会打断main函数中的QApplication::exec(),但是Gui界面还是可以正常响应,不会出现卡住的现象。这与用while来循环是不一样的。

下面介绍下使用的方法,其实使用很简单

(1)实例化

QEventLoop loop;

(2)启动事件循环

  1. //以上省略了部分代码,这是使用HTTP中的post来发送文件到服务器
  2. QNetworkReply *postReply = m_pNetManager->post(request, qbt); //post方式到本地服务器
  3. connect(postReply, SIGNAL(finished()), this, SLOT(postFileReplyFinished())); //成功后会有返回响应
  4. loop->exec(); //设置等待,若文件成功发送,则退出等待

(3)在其他的响应函数中退出循环

  1. void Widget::postFileReplyFinished()
  2. {
  3. QNetworkReply* reply = (QNetworkReply*)sender();
  4. QByteArray replyData = reply->readAll();
  5. //转为JSon格式,便于提取字段数据
  6. QJsonDocument jsonDoc= QJsonDocument::fromJson(replyData);
  7. if(!jsonDoc.isNull())
  8. {
  9. QJsonObject jsonObj = jsonDoc.object(); //转换格式
  10. if(jsonObj.contains("status"))
  11. {
  12. loop->exit(); //loop退出等待
  13. }
  14. }
  15. }

我实现的功能是,发送文件后,就进入事件循环,当接收到返回的json数据后,判断数据是否正确,正确的话就退出事件循环。

其实还有一种方法来实现事件循环的退出。就是使用QT中的信号与槽的机制,在初始化的时候,将 reply的响应与loop的quit连接起来。

  1. QEventLoop loop;
  2. qManager = new QNetworkAccessManager(this);
  3. QNetworkRequest request;
  4. request.setUrl(QUrl("http://localhost/public/index/file/upload"));
  5. QNetworkReply *reply = qManager->get(request);
  6. connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
  7. 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的使用相关推荐

  1. 关于Qt的事件循环以及QEventLoop的简单使用

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

  2. 【Qt】一个使用QEventLoop时,遇到的教训

    1.问题描述 伪代码如下: QEventLoop eventLoop; QObject::connect(this, &Class::signal, [](){doSomething();ev ...

  3. Qt开启本地事件循环(防止界面卡阻塞【卡死】)QEventLoop 的基本使用

    刚刚看别人的源码,发现大佬都是这么玩的 当要使用延时,又不想卡死界面时,就开启本地事件循环: 官方给出的说明如下: 记得,上次我写的那个狩猎者项目,用了一个记时器去判断,low得一逼. 可以开一个本地 ...

  4. 11.QT事件机制源码时序分析(下)

    接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109182406,本文继续解析QCoreApplication::sendEvent和Q ...

  5. 10.QT事件机制源码时序分析(中)

    接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109162220,上篇文章已经说过,在Ubuntu18.04,QT的事件机制实际上是采用 ...

  6. 9.QT事件机制源码时序分析(上)

    通过上两篇博客https://blog.csdn.net/Master_Cui/article/details/109093845和https://blog.csdn.net/Master_Cui/a ...

  7. 8.QT的事件循环与事件发送相关类

    一.QT的事件发送类QCoreApplication QT使用QCoreApplication类为Qt程序提供了事件循环机制.该类继承QObject.QCoreApplication包含主事件循环,来 ...

  8. 乱谈Qt事件循环嵌套

    本文旨在说明:QDialog::exec().QMenu::exec()等开启的局部事件循环,易用的背后,还有很多的陷阱... 引子 Qt 是事件驱动的,基本上,每一个Qt程序我们都会通过QCoreA ...

  9. QT开发(十二)——QT事件处理机制

    一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 ...

最新文章

  1. python扫描端口脚本_Python实现的端口扫描功能示例
  2. kubernetes log 流式数据处理
  3. ProEssentials实时三维图表控件
  4. java tail -f 后返回_tail -f 的实现 | 学步园
  5. Docker生成镜像的两种方式
  6. 51nod---无法表示的数
  7. grub shell 错误_使用grub-install修复Grub时出错
  8. 乐高ev3涉及到的一些赛事_使您成为英雄的前五名开发者技能(提示:涉及LEGO)
  9. c++语言while循环,c++ c语言while 循环语句入门基础教程
  10. Golang笔记——方法
  11. Eclipse使用SVN操作说明
  12. 阅读《C陷阱与缺陷》的知识增量
  13. 介绍一下关于Spring Cloud Stream
  14. php2个栈写一个队列,【数据结构】栈面试题--两个栈实现一个队列
  15. 笑话(12) 内裤都磨破了
  16. C语言常见编程题及答案40题
  17. angularjs select 下拉加载option 默认选中第一行为空格的解决办法
  18. ArcMap客户端——将shp属性表导出为excel
  19. 软件工程师核心竞争力有那些
  20. 转:使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制

热门文章

  1. 马云面向青年演讲:阿里巴巴是如何炼成的
  2. 安全架构-api接口安全设计
  3. 2022年加氢工艺特种作业证考试题库及答案
  4. deepfake安装
  5. C#开发实例大全(提高卷)
  6. iphoneX h5安全区域的问题
  7. C3PO链接池配置(附带jar)
  8. 泛型(Generic)简介
  9. spring-security-oauth2(十) QQ登陆上
  10. vscode官网下载慢解决