2016-03-25 10 views
0

Qtで何らかのコールバックを実装したいと思います。Qtでコールバックを実装する

私は、というApiHandlerというクラスをリクエストしています。そして、makeRequestにコールバック関数を渡し、replyFinishedのときに実行する必要があります。 私はstd :: function/std :: bindを使って方法を知っています。 Qtを使ってこれを行う方法がありますか?スロット?この場合、std :: function/std :: bindの使用についての詳細な説明。

ありがとうございます!

typedef void (*callback)(); 
void ApiHandler::makeRequest(QString method, QMap<QString, QString> parameters, callback) 
{ 
    QUrl url = this->buildCall(method, parameters); 

    connect(this->manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*, callback))); 

    QNetworkRequest request; 
    request.setUrl(url); 
    request.setRawHeader("User-Agent", "Test"); 

    QNetworkReply *reply = this->manager->get(request); 
    connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead())); 
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError))); 
    connect(reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(slotSslErrors(QList<QSslError>))); 
} 
void ApiHandler::replyFinished(QNetworkReply* reply, callback) 
{ 
    qDebug() << "replyFinished" << reply->url(); 
    QJsonDocument j = QJsonDocument::fromJson(reply->readAll()); 
    if (j.isEmpty()) { 
     // throw error 
    } 

    // call the callback with "j" as parameter 
    // callback(j) 

    reply->deleteLater(); 
} 
+0

どうしますか?コンパイル時にコールバックを解決できない場合にのみ、std :: functionが必要です。すべてのコールバックを前もって知っている場合は、それらをスロットにします。 – xvan

+0

私はこのような 'QMap mのように、別の呼び出しを行うことができます。 m ["user_id"] = this-> settings.value(USER_ID).toString(); ApiHandler * a =新しいApiHandler; a-> makeRequest( "users.isAppUser"、m、testCallback); ' 私は別のコールバックを渡す必要があります。たとえば、私はこのアプリを呼び出す場合、コールバックを渡して警告を表示します。私はこのウィンドウを呼び出してコールバックを渡すと、ユーザーはアプリを使用しています。 – Alex

+0

異なる信号、または[切断と接続スロット]で異なるオブジェクトを使用します(http://stackoverflow.com/questions/28524925/how-to-disconnect-a-signal-with-a-slot-temporarily-in -qt)on context – xvan

答えて

3

すでに既にQtのタイプをベースとするシグナルとスロットとmakeRequestパラメータを使用しているので、あなただけはQObjectから派生した信号を有する要求インスタンスに渡すことができます。

class Request : public QObject 
{ 
public: 
     QString method(); 
     QMap<QString, QString> parameters(); 

signals: 
    void received(QJsonDocument); 
}; 

replyFinishedは、代わりにコールバック

void ApiHandler::replyFinished(QNetworkReply* reply, Request* request) 

とeveythingは、あなただけの信号を発射準備ができているのRequestを渡すことができます。

request->received(j); 

Requestを渡す前に、必要なものを接続してください。

connect(request, &Request::received, [=](QJSonDocument) { 
    // whatever ... 
}); 
関連する問題