gpt4 book ai didi

c++ - 在 Qt 中实现回调

转载 作者:行者123 更新时间:2023-11-28 00:04:58 28 4
gpt4 key购买 nike

我想在 Qt 中实现某种回调。

我有一个名为 ApiHandler 的类用于发出请求。我应该有办法将函数作为回调传递给 ma​​keRequest 并在 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 ...
} );

关于c++ - 在 Qt 中实现回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36228905/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com