pass value to slot with QNetWorkAccessManager

坚强是说给别人听的谎言 提交于 2019-12-08 11:29:47

问题


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
}

回答1:


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
         .....
     }
 }



回答2:


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
}



回答3:


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


来源:https://stackoverflow.com/questions/21354844/pass-value-to-slot-with-qnetworkaccessmanager

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!