在replyFinished()中获取发起QNetworkRequest的函数

7

我有以下问题:

我有一个名为Foo的类,封装了一个web-api。接口包含以下函数:

Foo::addItem( QString id )
Foo::updateItem( QString id )

这两个函数使用相同的URL启动QNetworkRequest,但数据的使用方式不同。因此,在槽函数Foo::replyFinished(QNetworkReply *wf_reply)中,我需要知道QNetworkRequest从哪里发送。

你会如何解决这个问题?

我可以使用变量来存储QNetworkRequest的地址,以便稍后将其与wf_reply->request()进行比较,但这似乎是一种hack方法。考虑到您可能在执行第一次回复之前多次调用addItem()或updateItem(),最好的方法是向QNetworkRequest添加字符串或整数,其中包含函数名称或ID。


嗯,我一直在试图回忆我曾经是如何做到这一点的,但每次我仔细检查我的答案时,它都是错误的。抱歉。 - Brian Roach
2个回答

5
在您原始的QNetworkRequest中,您可以设置一个属性。
setAttribute(Attribute code, const QVariant & value)

Attribute 是一个枚举类型,而在这种情况下有一个保留代码 QNetworkRequest::User。(参见:Attribute

在你的 QNetworkReply 中,可以通过 request() 获取 QNetworkRequest,然后使用 attribute() 从中获取 Attribute

这可能有点 hack,但我认为应该能行。


request->setAttribute(QNetworkRequest::User, QVariant("addItem"));和if(reply->request().attribute(QNetworkRequest::User).toString().contains("addItem"))似乎是最“干净”的解决方案。 - Julian
好的答案。这是正确的方法。起初我错误地认为qnetworkreply->attribute(key)会包含我在请求中设置的属性,但事实并非如此。通过访问reply->request()解决了问题 :) - Sarim

0

你有四个选项:

  1. 将你创建的每个回复的 void QNetworkReply::finished() 信号与一个处理特定请求类型的函数连接
  2. 如Brian所建议的,在QNetworkRequest中使用setAttribute()
  3. 使用专为此目的添加的 void QNetworkRequest::setOriginatingObject(QObject * object)。在你的情况下问题是两种请求都来源于同一个QObject。你可以为发送其地址来标记请求创建两个虚拟QObject,或者使用reinterpret_cast将请求类型转换为指针。
  4. 像你建议的那样自己跟踪已发起的请求。因为可以同时存在任意数量的请求,所以你需要使用两个指针列表(每种请求一个)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接