我不知道该如何使用QEventLoop。我有两段代码,它们都适合我(下载web资源)。
第一个:
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();第二个:
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()?我在某个地方找到了第二个解决方案,但它对我来说似乎并不合适,所以我将其修改为第一段代码。
发布于 2017-01-02 01:50:15
在你的第二个例子中,事件循环永远不会退出,另一方面,在你的第一个例子中,当finished(QNetworkReply*)发出时,循环将退出。但是,如果在您连接循环的退出之前manager->get( request );导致finished(QNetworkReply*)信号被发出,该怎么办?
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*))的情况。
https://stackoverflow.com/questions/29449561
复制相似问题