使用 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】:在这种情况下,您不能使用QSignalMapper
。 QSignalMapper
允许为每个发件人单独指定附加数据。但是,您只有一个发件人(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 将值传递给插槽的主要内容,如果未能解决你的问题,请参考以下文章
跨 dll 使用 QNetworkAccessManager
使用 QNetWorkAccessManager 将值传递给插槽
如何使用 Qt/QNetworkAccessManager (C++) 实现 SFTP