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();
}
どうしますか?コンパイル時にコールバックを解決できない場合にのみ、std :: functionが必要です。すべてのコールバックを前もって知っている場合は、それらをスロットにします。 – xvan
私はこのような 'QMap mのように、別の呼び出しを行うことができます。 m ["user_id"] = this-> settings.value(USER_ID).toString(); ApiHandler * a =新しいApiHandler; a-> makeRequest( "users.isAppUser"、m、testCallback); ' 私は別のコールバックを渡す必要があります。たとえば、私はこのアプリを呼び出す場合、コールバックを渡して警告を表示します。私はこのウィンドウを呼び出してコールバックを渡すと、ユーザーはアプリを使用しています。 –
Alex
異なる信号、または[切断と接続スロット]で異なるオブジェクトを使用します(http://stackoverflow.com/questions/28524925/how-to-disconnect-a-signal-with-a-slot-temporarily-in -qt)on context – xvan