Chinaunix首页 | 论坛 | 博客
  • 博客访问: 359646
  • 博文数量: 50
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 641
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-09 22:35
个人简介

不怕你失败,就怕你爬不起来。

文章分类

全部博文(50)

文章存档

2014年(50)

我的朋友

分类: 嵌入式

2014-09-14 22:21:53

    在上一篇文章Qt技巧:QTextEdit显示网络图片 中,我们使用信号与槽机制实现了在QTextEdit上显示网络图片,但是接收和处理图片资源数据是在槽函数中进行的,为此,我们不得不将其分割为两个函数——一个发送资源请求,一个接收和处理资源。
    而实际上,在某些特殊的使用情境之下,我们希望图片资源的接收和处理能与图片资源的请求在同一个函数之内进行,这就要求程序能够提供足够的时间来接收数据,并在数据接收完成之后能够及时返回开放的资源接口,以完成下一步的处理操作。
    这里,QEventLoop为我们提供了解决的方法。来看官方的解释:

Detailed Description

The QEventLoop class provides a means of entering and leaving an event loop.

At any time, you can create a QEventLoop object and call () on it to start a local event loop. From within the event loop, calling () will force () to return.


翻译:
QEventLoop类为我们提供了一种进入和退出事件循环的方法。
在任何时候,你都可以创建一个QEventLoop实例,并通过调用exec()来启动一个事件循环。在循环期间,主动调用exit()可以使exec()强制返回。

    从以上说明可以略知QEventLoop的使用方法,陈列如下:
(1)创建QEventLoop实例;
(2)调用exec()来启动;
(3)通过exit()来使exec()退出并返回退出码。

    看起来挺简单的,不是吗?但是问题在于,如何掌握退出的时机呢?对了,就是“信号与槽”!!!

    本文的目的在于,接收完数据之后就返回,不是吗?那只要判断数据何时读取完毕就可以解决问题了。因此,采用信号与槽机制来判断数据是否接收完毕恰如其境。代码附上:
MainWindow::MainWindow(QWidget *parent) :
 QMainWindow(parent),
 ui(new Ui::MainWindow)
{
 ui->setupUi(this);
 QEventLoop loop;
 manager = new QNetworkAccessManager(this);

 QNetworkRequest request;
 request.setUrl(QUrl("http://www.350351.com/templets/default/css/images/logo.png"));
 QNetworkReply *reply = manager->get(request);
 connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));//关键之处1
 loop.exec();//关键之处2


 QPixmap pix;
 QByteArray data = reply->readAll();
 pix.loadFromData(data, "PNG");
 pix.save("./0001.png", "PNG", 100);
 ui->textEdit->append(" src=./0001.png>");
}



参考资料:
QEventLoop类说明:
QEventLoop使用两例:http://blog.csdn.net/dbzhang800/article/details/6300519

QEventLoop介绍的使用解析:https://www.qtdeveloperdays.com/2013/sites/default/files/presentation_pdf/Qt_Event_Loop.pdf
阅读(12386) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~