Цикл через подпрограммы QNetworkAccessManager get(), получение порядка по окончании

У меня есть QNetworkAccessManager как член моего класса. Подключаю готовый сигнал от этого менеджера к написанной мною функции replyFinished.

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)));
}

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


person user1216527    schedule 19.09.2015    source источник


Ответы (2)


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];
}
person HeyYO    schedule 19.09.2015

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

QNetworkReply::url():

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

QNetworkReply::request():

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

void MainWindow::replyFinished(QNetworkReply* reply)
{
    qDebug() << reply->url();
    qDebug() << reply->request().url();
}
person Orest Hera    schedule 19.09.2015