Mega4alik
Mega4alik

Reputation: 609

pass value to slot with QNetWorkAccessManager

I'm trying to use QsignalMapper to pass my String to img_loaded function, on finished SIGNAL. But I can not get any result, please help.

   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
}

Upvotes: 0

Views: 1451

Answers (3)

Alexey Tveritinov
Alexey Tveritinov

Reputation: 51

If you want to supply additional parameters to identify networkReply try this:

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

And there is the slot

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

Upvotes: 5

Pavel Strakhov
Pavel Strakhov

Reputation: 40502

You cannot use QSignalMapper in this case. QSignalMapper allows to specify additional data separately for each sender. However, you have only one sender (QNetworkAccessManager object). You could use QNetworkReply's signals (as @derkode suggested) and use QSignalMapper on them, but this is an over-complication.

QNetworkAccessManager already sends QNetworkReply* object as a signal parameter. That is quite similar to QSignalMapper functionality. We only need to attach additional data to each reply. For example, you can create such private field in your class:

QHash<QNetworkReply*, QString> data_storage;

Replace QString with the type of your additional data (QVariant, int, or else). Add data when you make a request:

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

Get that data when the request is finished and clean up:

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

Upvotes: 2

Adam Shakhabov
Adam Shakhabov

Reputation: 1346

Try so:

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

Upvotes: -1

Related Questions