2015-09-19 24 views
1

我有一個QNetworkAccessManager作爲我班的成員。我將來自該管理器的完成信號連接到我寫過的replyFinished函數。通過QNetworkAccessManager循環獲取()例程,檢索完成訂單

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

get調用在我replyFinished插槽常規,我知道我可能不會接收他們在被執行的命令的信號循環,但有什麼辦法可以獲得這些信息?也就是說,在我的replyFinished例程中,有沒有一種聰明的方法可以獲得「si」?謝謝您的幫助!

回答

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。請注意,這些網址可能會有所不同。

QNetworkReply::url()

返回下載或上傳的內容的URL。請注意, URL可能與原始請求的URL不同。

QNetworkReply::request()

返回被張貼了這個答覆的請求。特別是,請注意 請求的URL可能與回覆的URL不同。

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