QEventLoop正确用法

Bar*_*zar 8 qt qeventloop qtnetwork

我怀疑应该如何使用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();
Run Code Online (Sandbox Code Playgroud)

第二个:

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();
Run Code Online (Sandbox Code Playgroud)

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

小智 1

在第二个示例中,事件循环永远不会退出,另一方面,在第一个示例中,循环将在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();
Run Code Online (Sandbox Code Playgroud)

SIGNAL(finished(QNetworkReply*))而且您还需要以某种方式处理经理根本不排放的情况。