您好,我正在从 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;
}
关于c++ - 如何使用qt中的信号槽控制函数的返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58431653/