在Qt中实现回调

时间:2016-03-25 22:14:18

标签: c++ qt c++11

我想在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();
}

1 个答案:

答案 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 ...
} );