2015-09-19 13 views
1

У меня есть QNetworkAccessManager как член моего класса. Я подключаю готовый сигнал от этого менеджера к функции replyFinished, которую я написал.Looping через QNetworkAccessManager get() процедуры, восстановить порядок по окончании

manager = new QNetworkAccessManager(this); 
    connect(manager, SIGNAL(finished(QNetworkReply*)),this,SLOT(replyFinished(QNetworkReply*))); 

В отдельной процедуре, я петлю через ПОЛУЧИТЬ звонок от менеджера

for (int si = 0; si<numLines; si++) 
{ 
    QString line = lines[si]; 
    manager->get(QNetworkRequest(QUrl(line))); 
} 

В моей replyFinished рутины слота, я знаю, что не может принимать сигналы в порядке их были выполнены в но есть ли способ получить эту информацию? То есть, есть ли умный способ получить «си» в моем ответе? Спасибо за помощь!

ответ

1

QNetworkAccessManager::get() возвращает указатель на объект QNetworkReply. Этот указатель является тем же самым, что и ваш слот replyFinished(). Вы можете использовать QMap для хранения спаривания указателей и целых чисел QNetworkReply * (si в вашем коде).

Настоящий рабочий пример;

#include <QCoreApplication> 
#include <QNetworkAccessManager> 
#include <QNetworkReply> 
#include <QNetworkRequest> 
#include <QUrl> 
#include <QMap> 

#include <QtDebug> 

QNetworkAccessManager am; 
void finished(QNetworkReply* reply); 

QMap<QNetworkReply*, int> requests; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    QObject::connect(&am, &QNetworkAccessManager::finished, finished); 

    QStringList links; 
    links << "http://google.com"; 
    links << "http://taobao.com"; 
    links << "http://stackoverflow.com"; 
    links << "http://stackexchange.com"; 
    links << "http://bing.com"; 


    for (int i=0; i < links.size(); i++) 
    { 
     requests.insert(am.get(QNetworkRequest(QUrl(links[i]))), i); 
    } 

    return a.exec(); 
} 

void finished(QNetworkReply* reply) 
{ 
    qDebug() << requests[reply]; 
} 
1

Слот replyFinished(QNetworkReply*) получает указатель на соответствующий объект ответа. Этот объект ответа содержит всю информацию об этом ответе (код ошибки, заголовки, загруженные данные, URL-адрес контента), а также содержит первоначальный запрос (QNetworkReply::request()). Таким образом, можно проверить URL-адрес запроса или URL-адреса фактического загруженного контента. Обратите внимание, что эти URL-адреса могут отличаться.

QNetworkReply::url():

Возвращает URL содержания загруженного или загруженном. Обратите внимание, что URL-адрес может отличаться от URL-адреса исходного запроса.

QNetworkReply::request():

Возвращает запрос, который был размещён для этого ответа. В специальном примечании указано, что URL-адрес запроса может отличаться от URL-адреса ответа.

void MainWindow::replyFinished(QNetworkReply* reply) 
{ 
    qDebug() << reply->url(); 
    qDebug() << reply->request().url(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^