【问题标题】:pass value to slot with QNetWorkAccessManager使用 QNetWorkAccessManager 将值传递给插槽
【发布时间】:2014-01-25 18:58:19
【问题描述】:

我正在尝试使用 QsignalMapper 在完成的 SIGNAL 上将我的字符串传递给 img_loaded 函数。但我无法得到任何结果,请帮助。

   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
}

【问题讨论】:

  • 您的代码中没有使用QSignalMapper。你有什么尝试吗?你的具体问题是什么?
  • 是的,我正在试验 QSignalMapper。问题是我不知道如何使用 QSignalMapper。你能给我举个例子吗

标签: qt qt-signals


【解决方案1】:

如果你想提供额外的参数来识别 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
         .....
     }
 }

【讨论】:

    【解决方案2】:

    在这种情况下,您不能使用QSignalMapperQSignalMapper 允许为每个发件人单独指定附加数据。但是,您只有一个发件人(QNetworkAccessManager 对象)。您可以使用QNetworkReply 的信号(如@derkode 建议的那样)并在它们上使用QSignalMapper,但这过于复杂了。

    QNetworkAccessManager 已经发送QNetworkReply* 对象作为信号参数。这与QSignalMapper 功能非常相似。我们只需要在每个回复中附加额外的数据。例如,您可以在类中创建这样的私有字段:

    QHash<QNetworkReply*, QString> data_storage;
    

    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
    }
    

    【讨论】:

      【解决方案3】:

      试试吧:

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

      【讨论】:

      • 据我所知,在这段代码中,我们可以提供一些属性来回复,然后再获取它。让我们试试
      猜你喜欢
      • 2020-03-12
      • 2012-01-08
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 2018-09-14
      • 2022-01-10
      • 2011-05-08
      相关资源
      最近更新 更多