gpt4 book ai didi

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

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

您好,我正在从 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/

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