2014-01-25 32 views
0

我試圖使用QsignalMapper將我的字符串傳遞給img_loaded函數,在完成的信號上。但我無法得到任何結果,請幫助。QNetWorkAccessManager將值傳遞給插槽

QString mystring = "value"; 
    QNetworkAccessManager *m_netwManager = new QNetworkAccessManager(this); 
    QUrl url("http://images.gs-cdn.net/static/albums/80_9299765.jpg"); 
    QNetworkRequest request(url); 
    connect(m_netwManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(img_loaded(QNetworkReply*))); 

void MainWindow::img_loaded(QNetworkReply *rep){ 
    //Handle my String here 
} 
+0

你的代碼中沒有'QSignalMapper'的用法。你嘗試過什麼嗎?你確切的問題是什麼? –

+0

是的,我正在試驗QSignalMapper。問題是我不知道如何使用QSignalMapper。你能舉個例子來說明我的情況嗎? – Mega4alik

回答

-1

試試這樣:

QString mystring = "value"; 
QNetworkRequest request; 
request.setUrl(QUrl("http://images.gs-cdn.net/static/albums/80_9299765.jpg"); 

QNetworkAccessManager m_networkManager = new QNetworkAccessManager(this); 
QNetworkReply *reply = m_networkManager->get(request); 

connect(reply, SIGNAL(finished()), this, SLOT(img_loaded())); 


void MainWindow::img_loaded() { 
    //For example 
    QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender()); 
    QByteArray data = reply->readAll(); 
} 
+0

正如我在這段代碼中理解的,我們可以給一些財產來回復,然後得到它。試試吧 – Mega4alik

2

您不能在這種情況下使用QSignalMapperQSignalMapper允許分別爲每個發件人指定附加數據。但是,您只有一個發件人(QNetworkAccessManager對象)。您可以使用QNetworkReply的信號(建議使用@derkode)並使用QSignalMapper,但這是過於複雜。

QNetworkAccessManager已經發送QNetworkReply*對象作爲信號參數。這與QSignalMapper功能非常相似。我們只需要將附加數據附加到每個回覆。例如,你可以在你的類創建這樣的私有字段:

替換QString與附加數據(的QVariant,int或其他)的類型。添加數據時,你犯了一個請求:

QNetworkReply* reply = m_netwManager->get(...); 
data_storage[reply] = my_data; 

獲得這些數據,當請求完成清理工作:

void MainWindow::img_loaded(QNetworkReply *reply) { 
    QString my_data = data_storage[reply]; 
    data_storage.remove(reply); 
    //... read reply and use data 
} 
+0

非常感謝! –

4

如果你要提供額外的參數來識別networkReply試試這個:

void myClass::downloadMedia(QString url, int mediaType, int messageID) 
{ 
    bool connect_result; 
    QNetworkAccessManager *manager2 = new QNetworkAccessManager(this); 
    connect_result = connect(manager2, SIGNAL(finished(QNetworkReply*)), 
      this, SLOT(onMediaDownloaded(QNetworkReply*))); 
    Q_ASSERT(connect_result); 

    QNetworkReply* reply = manager2->get(QNetworkRequest(url)); 
// Here are the additional parameters 
    reply->setProperty("mediaType", mediaType); 
    reply->setProperty("messageID", messageID); 
} 

而且有槽

void myClass::onMediaDownloaded(QNetworkReply *reply) 
{ 
    int mediaType = reply->property("mediaType").toInt(); 
    int messageID = reply->property("messageID").toInt(); 
    switch (mediaType) { 
     // Handle different media types 
     ..... 
    } 
}