QNetworkRequest::User 和 QNetworkRequest::UserMax 之间的差异

Difference between QNetworkRequest::User and QNetworkRequest::UserMax

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

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

首先,两者都用于通过方法 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"))
// ...

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

The default implementation of Network Access will ignore any request attributes in this range and it will not produce any attributes in this range in replies. The range is reserved for extensions of 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;
     }
 };

现在,关于他们两者的区别:有none。他们是一样的东西。 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)。实际上,与动态属性不同,属性不是为自定义数据提供存储。