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

标签 c++ 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;
}

关于c++ - 如何使用qt中的信号槽控制函数的返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58431653/

相关文章:

c++ - 调用 SDL_RenderCopy 时出现异常

css - QT-CSS : decoration on focus

qt - Runner::call: 上下文 -1 的套接字为空

c++ - analogRead 在库中返回 0

c++ - 何时/何地/为什么 size_t 不是 uint?

c++ - 在堆上创建对象需要对象的大小吗?

c++ - 在 C++ 中将连续范围映射到离散区间

c++ - 我必须在调用 qRegisterMetaType 之前调用 Q_DECLARE_METATYPE 吗?

c++ - Qt : Smooth a circular mask. 删除锯齿状边缘

c++ - 在 C++ (Qt) 中设置具有非本地 IP 地址的服务器