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

4

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

它们各自的含义是什么,它们之间有什么区别?

1个回答

4
首先,两者都用于通过方法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"))
// ...
BUT: 如果你想使用特殊类型属性,你需要自己实现。正如你在文档中所读到的:

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

简而言之,如果要使用QNetworkRequest::UserQNetworkRequest :: UserMax 属性,则需要子类化 QNetworkAccessManager。下面是一个非常简单的示例:

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是一个枚举类型,你可以使用完整的自定义值范围,从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)。实际上,与动态属性不同,属性并不提供自定义数据的存储。


非常感谢,"属性不是用来提供自定义数据存储的",那么它们是用来做什么的? - iMath
他们在这里控制您发送的请求,并且控制您收到的回复信息。因此,他们的主要目标不是为了存储请求数据,而只是提供有关它的信息。 - IAmInPLS
我正在使用QT5,似乎QNetworkRequest不是QObject的子类,因此setProperty方法在其上不可用。(但setAttribute是可用的...) - gregn3

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