在Qt中实现回调

Implementing callback in Qt

本文关键字:回调 实现 Qt      更新时间:2023-10-16

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

由于您已经在使用信号和插槽,并且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 )

当一切准备就绪时,你只需发射信号。

request->received( j ); 

在传入Request之前,您只需连接您想要的任何内容。

connect( request, &Request::received, [=]( QJSonDocument ) {
    // whatever ...
} );