首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QEventLoop的正确用法

QEventLoop的正确用法
EN

Stack Overflow用户
提问于 2015-04-05 01:47:31
回答 1查看 20.2K关注 0票数 9

我不知道该如何使用QEventLoop。我有两段代码,它们都适合我(下载web资源)。

第一个:

代码语言:javascript
复制
QNetworkAccessManager *manager = new QNetworkAccessManager( this );
QNetworkRequest request;
request.setUrl(QUrl(url));
request.setRawHeader("User-Agent", "Mozilla Firefox");
connect(manager, SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));
manager->get( request )  ;

QEventLoop loop;
connect(manager, SIGNAL(finished(QNetworkReply*)),&loop, SLOT(quit()));
loop.exec();

第二个:

代码语言:javascript
复制
QNetworkAccessManager *manager = new QNetworkAccessManager( this );
QNetworkRequest request;
request.setUrl(QUrl(url));
request.setRawHeader("User-Agent", "Mozilla Firefox");
manager->get( request )  ;

QEventLoop loop;
connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(replyFinished(QNetworkReply*)));
loop.exec();

我想知道的是我应该使用哪一个。我的意思是,在发出信号后,事件循环会在第二个事件循环中退出吗?或者我必须像第一个一样调用quit()?我在某个地方找到了第二个解决方案,但它对我来说似乎并不合适,所以我将其修改为第一段代码。

EN

回答 1

Stack Overflow用户

发布于 2017-01-02 01:50:15

在你的第二个例子中,事件循环永远不会退出,另一方面,在你的第一个例子中,当finished(QNetworkReply*)发出时,循环将退出。但是,如果在您连接循环的退出之前manager->get( request );导致finished(QNetworkReply*)信号被发出,该怎么办?

代码语言:javascript
复制
QNetworkAccessManager *manager = new QNetworkAccessManager( this );
QNetworkRequest request;
QEventLoop loop;
request.setUrl(QUrl(url));
request.setRawHeader("User-Agent", "Mozilla Firefox");
connect(manager, SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*)));
connect(manager, SIGNAL(finished(QNetworkReply*)),&loop, SLOT(quit()));
manager->get( request )  ;

loop.exec();

此外,您还需要以某种方式处理管理器根本不发出SIGNAL(finished(QNetworkReply*))的情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29449561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档