Reputation: 609
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
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
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
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