在Qt中实现回调
Implementing callback in 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();
}
由于您已经在使用信号和插槽,并且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 ...
} );
相关文章:
- 如何使用 Node-addon-API 实现 node-nan 回调
- 在C++中实现回调
- C++回调计时器实现
- 如何实现从C++函数到 Swift 的回调
- 实现此"on error, throw"回调的最佳方法是什么?
- 如何在 C++ 与 CPLEX 中实现宏节点回调
- OpenCL C++ Bindings:如何实现 enqueueWriteBuffer 竞争的回调
- 在C 中的类中实现回调功能
- 如何实现从 Java 调用C++的回调函数
- 在C 抽象类中实现回调(对于C库)为纯虚拟
- c++实现定时回调函数
- C++ - 在 C++ 中实现回调时的允许错误
- 如何使用接口实现回调
- 在Qt中实现回调
- C++ 使用成员函数回调实现按钮
- 如何实现一系列使用非静态类字段的类成员回调
- 使用 Qt 信号和插槽实现 c++ 回调
- libspotify的正确实现get_audio_buffer_stats回调
- 使用Windows消息循环的回调实现
- 棘手的回调实现(C++)