如何从 readyReadSlot 中取出数据?

How to get data out of readyReadSlot?

我正在尝试使用信号 readyRead() 从槽中取出数据。但是我的方法好像不行。我在谷歌上搜索了很多,但仍然无法解决问题。

这是我的:

在我的主要功能中,我调用方法 sendPOST() 来获取 cookie。我使用 SIGNAL finished(QNetworkReply *) 和 SLOT replyFinishedSlot_(QNetworkReply *) :

从这个方法中获取了 cookie
connect(manager_, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinishedSlot_(QNetworkReply *)));

我创建了一个 public 静态布尔变量 isFinished = false 默认情况下写入如果插槽完成它的工作。

replyFinishedSlot_(QNetworkReply ):

if(reply->error())
        qDebug() << "Error: " << reply->errorString();
    else
    {
        cookie = reply->manager()->cookieJar()->cookiesForUrl(webReportsUrl);
        QString cookieString = cookie[0].name() + "=" + cookie[0].value() + "; domain=" + cookie[0].domain() + "; path=" + cookie[0].path() + ";";

        if(reply->isFinished()) isFinished = true; //isFinished is static public variable
    }
    reply->deleteLater();

然后我检查我的主函数是否 isFinished 为真,如果是我连接到另一个插槽:

manager_ = new QNetworkAccessManager(this);
sendPOST("http://url");

if(isFinished)
{
    QNetworkAccessManager *man = new QNetworkAccessManager();
    QNetworkRequest request(webReportsUrl);
    request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookie));
    getReply = man->get(request);  
    connect(getReply, SIGNAL(readyRead()), this, SLOT(readyReadSlot_()));

    if(isRead)
        qDebug() << "reading";
    else qDebug() << "not reading";
}

and isFinished 在这里工作得很好(但我不确定这是否是检查完成或不这样的正确方法)。我得到 isFinished == true,我可以从 replyFinishedSlot_ 得到 cookie。 但是问题是从readyReadSlot_()获取数据。我尝试了不同的方法从这个插槽接收数据,但没有成功的结果。

我什至尝试过这样的事情:

QEventLoop loop;
connect(getReply, SIGNAL(readyRead()), &loop, SLOT(readyReadSlot_()));
loop.exec();

但是我得到了错误:

QObject::connect: No such slot QEventLoop::readyReadSlot_() in ...

在 readyReadSlot_() 内部,我必须从页面接收所有数据:

if(getReply->isReadable())
    {
        if(getReply->error() != QNetworkReply::NoError)
        {
            qDebug() << "Error: " << getReply->errorString();
        }
        else {
            isRead = true;
            response = getReply->readAll(); //here the data I need outside of this slot

            qDebug() << "response: " << response;
        }
    }
    getReply->deleteLater();

并且我在里面成功获取了它,但是我需要在这个插槽之外获取 response,例如在我的主函数中。

我知道这里有一些线程,我只是没有等到数据收到,但我不知道如何修复它。

我找到了适合我的问题解决方法。

void DataMartsModel::replyFinishedSlot_(QNetworkReply *reply)
{    
    static bool isRead = false;
    if(reply->error())
        qDebug() << "Error: " << reply->errorString();
    else
    {
        cookie = reply->manager()->cookieJar()->cookiesForUrl(webReportsUrl);
        QString cookieString = cookie[0].name() + "=" + cookie[0].value() + "; domain=" + cookie[0].domain() + "; path=" + cookie[0].path() + ";";

        QNetworkAccessManager *man = new QNetworkAccessManager();
        QNetworkRequest request(webReportsUrl);
        request.setHeader(QNetworkRequest::CookieHeader, QVariant::fromValue(cookie));
        getReply = man->get(request);
        connect(getReply, &QNetworkReply::readyRead, [=](){
            if(getReply->isReadable())
            {
                if(getReply->error() != QNetworkReply::NoError) qDebug() << "Error: " << getReply->errorString();
                else {
                    isRead = true;
                }
            }
        });

        if(reply->isFinished() && getReply->isReadable()) isFinished = true; //here is the problem solvation I wanted
    }
    reply->deleteLater();
}

主要功能

manager_ = new QNetworkAccessManager(this);
sendPOST("http://url");

if(isFinished)
{
    QByteArray array = getReply->readAll(); //here I got the data I needed to get from readyReady
    qDebug() << array; //here I display it and I can use them in the future
}

如果你知道更好的解决方法,我也想看看。