Search code examples
c++qtqnetworkaccessmanagerqt-signals

Looping through QNetworkAccessManager get() routines, retrieve order on finish


I have a QNetworkAccessManager as a member of my class. I connect the finished signal from this manager to the replyFinished function I have written.

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

In a separate routine, I loop through a get call from the manager

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

In my replyFinished slot routine, I know I may not receive the signals in the order they were performed in the loop, but is there any way I can obtain that information? That is, is there a clever way I can obtain "si" in my replyFinished routine? Thanks for the help!


Solution

  • QNetworkAccessManager::get() returns a pointer to the QNetworkReply object. This pointer is the same one that is passed your replyFinished() slot. You can use a QMap to store pairings of QNetworkReply* pointers and integers (si in your code).

    Here is a working example;

    #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];
    }