2

メインの Application クラスから呼び出してさまざまな Web サービスを呼び出すクラス (RequestHandler) があります。サービスが完了すると、クラスはシグナルを呼び出し元のクラスに送り返し、サービスが終了したことを伝えます (おそらく QString メッセージで)。テスト メソッドで Signal が機能していますが、QNetworkAccessManager がまったく機能していません。私は QT と C++ の初心者です。ご協力いただきありがとうございます。

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

ご協力いただきありがとうございます。

4

1 に答える 1

1

 エラーが発生したときに通知されるように、通常はと シグナルにQNetworkAccessManager接続して使用する必要があります。error()finished()

これは、メモリリークを引き起こし、そのような種類のオブジェクトを1つだけ必要とするため、QNetworkAccessManagerオブジェクトを構築することは非常に悪い考えです。validateRegistration()したがって、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()が呼び出されていることを確認してください。これにより、メインイベントループが実行されます。

于 2012-10-19T06:48:11.867 に答える