如何从 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
}
如果你知道更好的解决方法,我也想看看。
我正在尝试使用信号 readyRead() 从槽中取出数据。但是我的方法好像不行。我在谷歌上搜索了很多,但仍然无法解决问题。
这是我的:
在我的主要功能中,我调用方法 sendPOST()
来获取 cookie。我使用 SIGNAL finished(QNetworkReply *)
和 SLOT replyFinishedSlot_(QNetworkReply *)
:
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
}
如果你知道更好的解决方法,我也想看看。