2012-10-18 72 views
2

我有一个类(RequestHandler),我从我的主要应用程序类调用以调用各种Web服务。一旦服务完成,类将信号发送回调用类来表示它已完成(可能带有QString消息)。我有Signal在测试方法中工作,但QNetworkAccessManager根本不工作。我对QT和C++相当陌生。谢谢你的帮助。QT QNetworkAccessManager和信号

// 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"); 
} 

我调用这个类是这样的:

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

感谢您的帮助。

回答

1

你通常应该使用QNetworkAccessManager通过连接到error()finished()信号,让你在出错通知发生。

validateRegistration()中构造QNetworkAccessManager对象是一个非常糟糕的主意,因为它会导致内存泄漏,并且您只需要这种类型的一个对象。所以在RequestHandler的构造函数中做。

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()调用某处,所以你有主要事件循环运行。