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

时间:2016-05-18 05:47:27

标签: qt qt5 qnetworkaccessmanager

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

每个人的意思是什么,他们之间有什么区别?

1 个答案:

答案 0 :(得分:4)

首先,两者都用于通过方法QNetWorkRequest将属性设置为setAttribute(Attribute code, const QVariant &value)。例如,如果您有两个函数可以使用相同的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::Attributeenum,您可以获得从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"));

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