使用 QNetWorkAccessManager 将值传递给插槽

Posted

技术标签:

【中文标题】使用 QNetWorkAccessManager 将值传递给插槽【英文标题】:pass value to slot with 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。你能给我举个例子吗 【参考方案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();

【讨论】:

据我所知,在这段代码中,我们可以提供一些属性来回复,然后再获取它。让我们试试

以上是关于使用 QNetWorkAccessManager 将值传递给插槽的主要内容,如果未能解决你的问题,请参考以下文章

离线使用 QNetworkAccessManager

跨 dll 使用 QNetworkAccessManager

使用 QNetWorkAccessManager 将值传递给插槽

如何使用 Qt/QNetworkAccessManager (C++) 实现 SFTP

如何使用 QNetworkAccessManager 找出数据传输延迟

使用 QNetworkAccessManager 时如何处理代理