Search code examples
c++qtqtcoreqt-signalsqtnetwork

Connect qnetworkaccessmanager to slot


Now I have this code:

requester.h

#ifndef REQUESTER_H
#define REQUESTER_H

#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QtCore/QtCore>
#include <QVector>
#include <QObject>

class Requester
{
Q_OBJECT
public:
    Requester();
    ~Requester();
    QString get_last_reply();
    void send_request();
private:
    QNetworkAccessManager *manager;
    QVector<QString> replies;
public slots:
    void get_reply(QNetworkReply *reply);
};

#endif // REQUESTER_H

requester.cpp

#include "requester.h"

Requester::Requester()
{
    manager = new QNetworkAccessManager;
}

Requester::~Requester() {
    delete manager;
}


void Requester::get_reply(QNetworkReply *reply) {
    QByteArray res = reply->readAll();
    QString data = res.data();
    replies.push_back(data);
}

QString Requester::get_last_reply() {
    QString res =  replies.back();
    replies.pop_back();
    return res;
}
void Requester::send_request() {
    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this,     SLOT(get_reply(QNetworkReply*)));
    manager->get(QNetworkRequest(QUrl("http://google.com")));
}

And this error:

no matching function for call to 'QObject::connect(QNetworkReply*&, const char*, Requester* const, const char*)'

What's wrong? I've tried to use just connect instead of QObject::connect, but there was an error about the impossibility of converting QNetworkAccessmanager to socket.


Solution

  • The problem is that you are not inheriting QObject, so naturally: you cannot get slots handled in that class.

    You should write something like this:

    requester.h

    class Requester : public QObject
    {
    Q_OBJECT
    public:
        explicit Requester(QObject *parent);
    ...
    

    requester.cpp

    #include "requester.h"
    
    Requester::Requester(QObject *p)
        : QObject(p)
        , manager(new QNetworkAccessManager)
    {
    }
    ...
    

    Also, there is little to no point in this case to construct the QNetworkAccessManager on the heap as opposed to the stack. You could just have a QNetworkAccessManager m_networkAccessManager; member without the allocation, construction, and deletion, but this is just an additional information for the future.