Hello! I tried to make multiple connections to QNetworkAccessManager finished() signal.
I have ApiHandler class which makes a request handling.
And need to call a specific function after request finished (make use of slots).

I tried to make realization as below. But always worked only one connect (which is first one) - validateTokenFinished.
Explain how to properly realize what i want.
Thanks!

userapi.h
Qt Code:
  1. // includes...
  2. class UserApi : public QObject
  3. {
  4. Q_OBJECT
  5. public:
  6. explicit UserApi(QObject *parent = 0);
  7. void updateFriendList();
  8.  
  9. signals:
  10.  
  11. public slots:
  12. void friendListUpdated(QNetworkReply* reply);
  13.  
  14. };
To copy to clipboard, switch view to plain text mode 
userapi.cpp
Qt Code:
  1. // includes
  2. UserApi::UserApi(QObject *parent) :
  3. QObject(parent)
  4. {
  5. }
  6.  
  7. void UserApi::updateFriendList()
  8. {
  9. qDebug("UserApi::updateFriendList()");
  10.  
  11. QMap<QString, QString> m;
  12. // ...
  13.  
  14. ApiHandler *a = new ApiHandler;
  15.  
  16. connect(a->getManager(), SIGNAL(finished(QNetworkReply*)), this, SLOT(friendListUpdated(QNetworkReply*)));
  17.  
  18. a->makeRequest("friends.get", m);
  19. }
  20.  
  21. //! Not called at all
  22. void UserApi::friendListUpdated(QNetworkReply* reply)
  23. {
  24. QJsonDocument j = QJsonDocument::fromJson(reply->readAll());
  25. QJsonObject getjson = j.object();
  26.  
  27.  
  28. qDebug() << "UserApi::friendListUpdated()" << getjson;
  29.  
  30. reply->deleteLater();
  31. }
To copy to clipboard, switch view to plain text mode 

toolsapi.h
Qt Code:
  1. // includes...
  2. class ToolsApi : public QObject
  3. {
  4. Q_OBJECT
  5. public:
  6. explicit ToolsApi(QObject *parent = 0);
  7. void validateToken();
  8.  
  9. signals:
  10.  
  11. public slots:
  12. void validateTokenFinished(QNetworkReply* reply);
  13.  
  14. };
To copy to clipboard, switch view to plain text mode 
toolsapi.cpp
Qt Code:
  1. // includes
  2. ToolsApi::ToolsApi(QObject *parent) :
  3. QObject(parent)
  4. {
  5. }
  6.  
  7. void ToolsApi::validateToken()
  8. {
  9. qDebug("ToolsApi::validateToken()");
  10.  
  11. QMap<QString, QString> m;
  12. // ...
  13.  
  14. ApiHandler *a = new ApiHandler;
  15.  
  16. connect(a->getManager(), SIGNAL(finished(QNetworkReply*)), this, SLOT(validateTokenFinished(QNetworkReply*)));
  17.  
  18. a->makeRequest("tools.isTokenValid", m);
  19. }
  20.  
  21. void ToolsApi::validateTokenFinished(QNetworkReply* reply)
  22. {
  23. QJsonDocument j = QJsonDocument::fromJson(reply->readAll());
  24. QJsonObject getjson = j.object();
  25.  
  26. qDebug() << "ToolsApi::validateTokenFinished()" << getjson;
  27.  
  28. reply->deleteLater();
  29. }
To copy to clipboard, switch view to plain text mode 

mainwindow.h
Qt Code:
  1. // includes...
  2. namespace Ui {
  3. class MainWindow;
  4. }
  5.  
  6. class MainWindow : public QMainWindow
  7. {
  8. Q_OBJECT
  9.  
  10. public:
  11. explicit MainWindow(QWidget *parent = 0);
  12. ~MainWindow();
  13. ToolsApi c;
  14.  
  15. public slots:
  16. void on_testButton_clicked();
  17.  
  18. private:
  19. Ui::MainWindow *ui;
  20. };
To copy to clipboard, switch view to plain text mode 
mainwindow.cpp
Qt Code:
  1. MainWindow::MainWindow(QWidget *parent) :
  2. QMainWindow(parent),
  3. ui(new Ui::MainWindow)
  4. {
  5. // ...
  6. ui->setupUi(this);
  7.  
  8. c.validateToken();
  9. }
  10.  
  11. void MainWindow::on_testButton_clicked()
  12. {
  13. UserApi friends;
  14.  
  15. friends.updateFriendList();
  16. }
To copy to clipboard, switch view to plain text mode 

And an ApiHandler class

apihandler.h
Qt Code:
  1. // includes...
  2. class ApiHandler : public QObject
  3. {
  4. Q_OBJECT
  5. public:
  6. explicit ApiHandler(QObject *parent = 0);
  7. void makeRequest(QString method, QMap<QString, QString> parameters);
  8. QNetworkAccessManager* getManager();
  9.  
  10. private:
  11. QUrl buildCall(QString method, QMap<QString, QString> parameters);
  12. QNetworkAccessManager* manager;
  13.  
  14. signals:
  15.  
  16. public slots:
  17. void slotReadyRead();
  18. void slotError(QNetworkReply::NetworkError error);
  19. void slotSslErrors(QList<QSslError> errorList);
  20. };
To copy to clipboard, switch view to plain text mode 
apihandler.cpp
Qt Code:
  1. // includes...
  2.  
  3. ApiHandler::ApiHandler(QObject *parent) :
  4. QObject(parent)
  5. {
  6. this->manager = new QNetworkAccessManager(this);
  7. }
  8.  
  9. QUrl ApiHandler::buildCall(QString method, QMap<QString, QString> parameters)
  10. {
  11. // ...
  12. }
  13.  
  14. void ApiHandler::makeRequest(QString method, QMap<QString, QString> parameters)
  15. {
  16. QUrl url = this->buildCall(method, parameters);
  17.  
  18. QNetworkRequest request;
  19.  
  20. request.setUrl(url);
  21. request.setRawHeader("User-Agent", "Test Client");
  22.  
  23. QNetworkReply *reply = this->manager->get(request);
  24.  
  25. connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
  26. connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError)));
  27. connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(slotSslErrors(QList<QSslError>)));
  28. }
  29.  
  30. void ApiHandler::slotError(QNetworkReply::NetworkError error)
  31. {
  32. //...
  33. }
  34.  
  35. void ApiHandler::slotSslErrors(QList<QSslError> errorList)
  36. {
  37. //...
  38. }
  39.  
  40. QNetworkAccessManager* ApiHandler::getManager()
  41. {
  42. return this->manager;
  43. }
To copy to clipboard, switch view to plain text mode