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() 获得信号?

在 Qt 中循环运行多个 url 请求

做一个qt网络请求

Pyside:QNetworkAccessManager 不发送请求

Tableau怎么连接到数据?

Kong - 通过 HTTP/2 连接到上游