2

I have a class (RequestHandler) that I call from my main Application class to call various web services. Once a service has completed the class sends a Signal back to the calling class to say that it has finished(possibly with QString message). I have the Signal working in a test method but the QNetworkAccessManager is not working at all. I am quite new to QT and C++. Thanks for your help.

// RequestHandler.h

#ifndef REQUESTHANDLER_H_
#define REQUESTHANDLER_H_

#include <QNetworkAccessManager>
#include <QUrl>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QOBJECT>
#include "MainAppClass.hpp"

class RequestHandler : public QObject
{
    Q_OBJECT

public:
    explicit RequestHandler(QObject *parent = 0);
    void validateRegistration(QString reg);
    void onStatusUpdateCompleted();
    void sayHi();

signals:
    void sendSignal(QString txt);
private:
    QNetworkAccessManager* manager;
    QObject* thisObj;

public slots:
    void onRequestCompleted();
};

#endif /* REQUESTHANDLER_H_ */

RequestHandler.cpp

#include "RequestHandler.h"

RequestHandler::RequestHandler(QObject *parent) : QObject(parent)
{
    thisObj= parent;
}
void RequestHandler::validateRegistration(QString reg) {
    QNetworkRequest request;
    request.setUrl(QUrl("the_registration_url"));
    manager = new QNetworkAccessManager();
    QNetworkReply *reply = manager->get(request);
    connect(reply, SIGNAL(finished()), this, SLOT(onRequestCompleted()));
}
void RequestHandler::onRequestCompleted() {
    // not getting here at all
}
void RequestHandler::sayHi()
{
    // this is working
    QObject::connect(this, SIGNAL(sendSignal(QString)), thisCellCast,   SLOT(recieveValue(QString)));
    emit sendSignal("HERES THE SIGNAL");
}

I am calling this class like this:

// test slots and reg
    RequestHandler rh(this);
//working
    rh.sayHi();
// not working
    rh.validateRegistration("test");

Thanks for your help.

4

1 回答 1

1

您通常应该QNetworkAccessManager通过连接到error()finished() 信号来使用,以便在发生错误时通知您。

在其中构造QNetworkAccessManager对象确实是个坏主意,validateRegistration()因为它会导致内存泄漏,而您只需要一个此类对象。所以在RequestHandler's 的构造函数中这样做。

void RequestHandler::validateRegistration(QString reg)
{
   QUrl url("the_registration_url");
   QNetworkRequest request(url);
   QNetworkReply *reply = manager->get(request);
   connect(reply, SIGNAL(finished()), SLOT(onRequestCompleted()));
   connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
           SLOT(onError(QNetworkReply::NetworkError)));
}

void RequestHandler::onRequestCompleted()
{
   qDebug() << "Request succeeded";
}

void RequestHandler::onError(QNetworkReply::NetworkError code)
{
   qError() << "Request failed with code " << code;
}

还要确保你在某处调用了 QApplication::exec() ,这样你就可以运行主事件循环。

于 2012-10-19T06:48:11.867 回答