如何从一个 QNetworkAccessManager 发送回复?

Posted

技术标签:

【中文标题】如何从一个 QNetworkAccessManager 发送回复?【英文标题】:How to dispatch replies from one QNetworkAccessManager? 【发布时间】:2016-02-17 13:58:50 【问题描述】:

Qt documentation says 表示每个应用程序将使用一个QNetworkAccessManager

一个 QNetworkAccessManager 应该足够整个 Qt 应用。

但是,我访问多个 Web 服务并且需要调用单独的函数来解析其中的每一个:

由于我只有 一个 QNetworkAccessManager::finished(QNetworkReply * reply) 信号,将回复发送到其单独的解析函数的最佳方式是什么?

当我创建请求时,我可以连接到每个QNetworkReply 对象的finished 信号:

QNetworkReply * QNetworkAccessManager::get(const QNetworkRequest & request)

但它是连接到只使用一次的信号的最佳方式(性能)吗?有更好的方法吗?


自己的相关问题:

    Best way to share cookies within Qt application What is the correct way to "stop / shutdown" a QNetworkAccessManager? QNetworkAccessManager get/post from different thread possible?

【问题讨论】:

【参考方案1】:

您可以使用QNetworkRequest::setOriginatingObject(QObject * object) 方法将原始对象的引用附加到请求中。

假设我们有两个对象发出网络请求。在这种情况下,您可以使用以下代码来区分回复。

QNetworkRequest *req1 = new QNetworkRequest();
req1->setOriginatingObject(sender1);
networkAccessManager->get(req1);

QNetworkRequest *req2 = new QNetworkRequest();
req2->setOriginatingObject(sender2);
networkAccessManager->get(req2);

在你的位置:

if(reply->request().originatingObject() == sender1)
     sender1->handle(...);


if(reply->request().originatingObject() == sender2)
     sender2->handle(...);

【讨论】:

原始对象可以实现一个接口(在你的情况下是句柄),然后即使 if 也可以去。 setOriginatingObject 的好主意

以上是关于如何从一个 QNetworkAccessManager 发送回复?的主要内容,如果未能解决你的问题,请参考以下文章

如何将模块从一个 virtualenv 复制到另一个

如何从 React 的另一个组件中读取变量?

如何从另一个 vuex 模块访问 getter?

如何从另一个函数更改 QGraphicsScene?

如何从一个 viewController 添加多个 segue

如何从sqlite中选择一个日期