QNetworkAccessManager连接到2个回复槽,我怎么知道哪个回复属于哪个请求
Posted
技术标签:
【中文标题】QNetworkAccessManager连接到2个回复槽,我怎么知道哪个回复属于哪个请求【英文标题】:QNetworkAccessManager connected to 2 reply slots, how do I know which reply belongs to which request 【发布时间】:2018-11-06 00:13:13 【问题描述】:我的应用程序中有 1 个QNetworkAccessManager
,我同时发出 2 个请求。当我从经理那里得到答复时,答复不是我打电话给他们的顺序,这是有道理的。我该如何解决这个问题?我应该让其他经理来解决任何请求队列问题吗?
QNetworkRequest request1(ONE_GET);
request1.setRawHeader("Content-Type", "application/vnd.api+json");
request1.setRawHeader("Accept", "application/vnd.api+json");
m_nam.get(request1);
connect(&m_nam, &QNetworkAccessManager::finished,this , &HelperClass::onReply1Recieved);
QNetworkRequest request2(TWO_GET);
request2.setRawHeader("Content-Type", "application/vnd.api+json");
request2.setRawHeader("Accept", "application/vnd.api+json");
m_nam.get(request2);
connect(&m_nam, &QNetworkAccessManager::finished,this , &HelperClass::onReply2Recieved);
【问题讨论】:
这是一个不同的插槽 好的,抱歉。您希望在第一个请愿结束时开始第二个请愿吗? 我可以通过在onReply1REceived()
内向第一个快速关闭第二个的信号来处理它,但我认为它不干净
你没有回答我,据我了解你想开始第一个请求,当你完成第一个请求时你只想被称为第二个请求,也就是说他们在排队,我说的对吗?
我刚刚尝试过(当 1 完成时调用 2),它实际上解决了我在回复中没有 JSON 数据时遇到的问题,我想知道为什么嗯
【参考方案1】:
在您的情况下,问题是两个插槽都连接到同一个信号,因此两者都会收到通知,即使您尝试断开不能保证其正常工作的信号,解决方案是连接每个插槽的信号QNetworkReply
:
QNetworkRequest request1(ONE_GET);
request1.setRawHeader("Content-Type", "application/vnd.api+json");
request1.setRawHeader("Accept", "application/vnd.api+json");
QNetworkReply *reply1 = m_nam.get(request1);
connect(reply1, &QNetworkReply::finished, this, &HelperClass::onReply1Recieved);
QNetworkRequest request2(TWO_GET);
request2.setRawHeader("Content-Type", "application/vnd.api+json");
request2.setRawHeader("Accept", "application/vnd.api+json");
QNetworkReply *reply2 = m_nam.get(request2);
connect(reply2, &QNetworkReply::finished, this, &HelperClass::onReply2Recieved);
void HelperClass::onReply1Recieved()
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
qDebug() << reply->readAll();
void HelperClass::onReply2Recieved()
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
qDebug() << reply->readAll();
【讨论】:
不错!回复是唯一的,因此信号被单独调用。说得通。谢谢!以上是关于QNetworkAccessManager连接到2个回复槽,我怎么知道哪个回复属于哪个请求的主要内容,如果未能解决你的问题,请参考以下文章
如何从 QNetworkAccessManager::networkAccessibleChanged() 获得信号?