如何使用 qt 中的信号槽控制函数的返回



嗨,我正在从 API 请求一个 json 对象。我正在使用信号槽来读取回复,然后将回复转换为 json 对象。直到这里一切都好

但是当我想给出输出时出现问题,我正在使用类成员来提供输出,但类成员稍后会得到更新,函数返回类成员初始值。

我的问题是如何确保该值在返回之前已更新。 我已经尝试过QTimer,但没有解决问题。

qint64 RestApiFetcher::totalSize()
{
request->setUrl(m_ipaddr + "?$count=true" + m_strtop);
IgnoreSSLCertification();
mNetReply = mNetManager->get(*request);
connect(mNetReply,&QIODevice::readyRead,this,&RestApiFetcher::dataReadSize);
connect(mNetReply,&QNetworkReply::finished,this,&RestApiFetcher::dataReadSizeFinished);
qDebug() << m_totalSize;
return m_totalSize;
}
void RestApiFetcher::dataReadSizeFinished()
{
if( mNetReply->error()){
qDebug() << "There was some error : " << mNetReply->errorString();
}else{
QJsonDocument doc = QJsonDocument::fromJson(*mDataBuffer);
QJsonObject data = doc.object();
m_totalSize = data["count"].toInt();
}
qDebug() << "#############";
qDebug() << m_totalSize;
}

输出为

0
#############
150

我需要的是

#############
150
150

基本上插槽应该首先运行,然后函数应该给出输出。

更新


qint64 RestApiFetcher::totalSize()
{
request->setUrl(m_ipaddr + "?$count=true" + m_strtop);
IgnoreSSLCertification();
mNetReply = mNetManager->get(*request);
QEventLoop loop;
connect(mNetReply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
loop.exec(); // waits until `quit` called from signal above
disconnect(mNetReply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
dataReadSizeFinished();
qDebug() << m_totalSize;
return m_totalSize;
}

输出为

#############
0
0

一个可能的解决方案是使用QEventLoop来等待finished发生。如果我需要在继续之前等待网络通信,这就是我所做的。这将消除对dataReadSizeFinished的需求,然后可以将其组合到您的totalSize函数中,或者仅使用对该函数的简单调用而不是通过信号。

qint64 RestApiFetcher::totalSize()
{
request->setUrl(m_ipaddr + "?$count=true" + m_strtop);
IgnoreSSLCertification();
QEventLoop loop;
connect(mNetReply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
mNetReply = mNetManager->get(*request);
loop.exec(); // waits until `quit` called from signal above
disconnect(mNetReply,&QNetworkReply::finished,&loop,&QEventLoop::quit);
dataReadSize();
dataReadSizeFinished();
qDebug() << m_totalSize;
return m_totalSize;
}

最新更新