QNetworkRequest::User 和 QNetworkRequest::UserMax 之间的区别

Posted

技术标签:

【中文标题】QNetworkRequest::User 和 QNetworkRequest::UserMax 之间的区别【英文标题】:Difference between QNetworkRequest::User and QNetworkRequest::UserMax 【发布时间】:2016-05-18 05:47:27 【问题描述】:

我在QNetworkRequest的文档中找到了QNetworkRequest::User和QNetworkRequest::UserMax,但是根据找到的解释我无法理解每一个的含义。

每一个是什么意思,它们有什么区别?

【问题讨论】:

【参考方案1】:

首先,两者都用于通过setAttribute(Attribute code, const QVariant &value) 方法将属性设置为QNetWorkRequest。例如,如果您有两个函数使用相同的 URL 启动 QNetworkRequest,但它们使用不同的数据,并且您需要知道 QNetworkRequest 的来源,那么您将需要使用属性。

首先,您将属性设置为您的请求:

request->setAttribute(QNetworkRequest::User, QVariant("myRequest")); 

然后,由于您首先放置的属性,您会收到您的请求:

if(reply->request().attribute(QNetworkRequest::User).toString().contains("myRequest"))
// ...

但是:你需要自己的实现来使用特殊的类型属性。正如您可能在文档中看到的那样:

网络访问的默认实现将忽略任何请求 此范围内的属性,它不会产生任何属性 这个范围的回复。该范围保留用于扩展 QNetworkAccessManager。

简而言之,您需要继承 QNetworkAccessManager 以使用 QNetworkRequest::UserQNetworkRequest::UserMax 属性。这是一个非常简单的例子:

class MyNetworkAccessManager : public QNetworkAccessManager 

    public:
    enum myAttribute  Attribute1 = QNetworkRequest::User, Attribute2 ;

    protected:

    QNetworkReply * createRequest ( Operation op, const QNetworkRequest & request, QIODevice * data = 0 ) 
    
        QNetworkReply *reply = QNetworkAccessManager::createRequest(op, request, data);
        if(request.attribute(Attribute1).isValid()) reply->setAttribute(Attribute1, request.attribute(Attribute1));
        if(request.attribute(Attribute2).isValid()) reply->setAttribute(Attribute2, request.attribute(Attribute2));
        return reply;
     
 ;

现在,关于他们两个之间的区别:没有。他们是一样的东西。 QNetworkRequest::UserMax 只是一个上限。

确实,QNetworkRequest::Attribute 是一个enum,并且为您提供了从QNetworkRequest::User = 1000QNetworkRequest::UserMax = 32767 的完整范围的自定义值。因此,您可以在为请求设置属性时执行此操作:

request->setAttribute(QNetworkRequest::User, QVariant("myRequest")); 
request->setAttribute(QNetworkRequest::User + 1, QVariant("myRequest1"));
request->setAttribute(QNetworkRequest::User + 100, QVariant("myRequest100"));
request->setAttribute(QNetworkRequest::UserMax, QVariant("lastRequest"));

注意:虽然属性看起来很有用,但在大多数情况下您可能希望使用setProperty(const char *name, const QVariant &value)。实际上,与动态属性不同,属性并不是为自定义数据提供存储。

【讨论】:

非常感谢,“属性不能为自定义数据提供存储”,那又是为了什么? 嗯,他们来这里是为了控制你发送的请求,也为了控制你从回复中得到的信息。因此,他们的主要目标不是为请求存储数据,而只是提供有关它的信息。 我正在使用 QT5,似乎 QNetworkRequest 不是 QObject 的后代,因此 setProperty 方法在它上面不可用. (但setAttribute 可用...)

以上是关于QNetworkRequest::User 和 QNetworkRequest::UserMax 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

Django过滤查询和或

用grep替换R中的“Q”和“Q”

AngularJS $q 和 $q.all 单个数据源和多个数据源合并(promise的说明)

社区发现评价指标Q和NMI讲解代码实现

正确使用 Blockquote、q 和 cite?

这段代码如何? GET方法和Q对象[关闭]