我想在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 :(得分:3)
由于您已经在使用信号和插槽,并且makeRequest
参数已经是基于Qt的类型,您可以传入一个派生自QObject并且有信号的Request实例。
class Request : public QObject
{
public:
QString method();
QMap<QString, QString> parameters();
signals:
void received( QJsonDocument );
};
然后, replyFinished
可以传递Request
而不是回调
void ApiHandler::replyFinished(QNetworkReply* reply, Request* request )
当eveything准备就绪时,你只需发出信号。
request->received( j );
在传递Request
之前,你只需连接任何你想要的东西。
connect( request, &Request::received, [=]( QJSonDocument ) {
// whatever ...
} );