Во-первых, оба используются для установки атрибутов на QNetWorkRequest
по методу setAttribute(Attribute code, const QVariant &value)
. Например, если у вас есть две функции, которые инициируют QNetworkRequest
с тем же URL-адресом, но они используют данные по-разному и что вам нужно знать, откуда возникла ошибка QNetworkRequest
, вам нужно будет использовать атрибут.
Во-первых, вы установите атрибут вашему запросу:
request->setAttribute(QNetworkRequest::User, QVariant("myRequest"));
И тогда вы получите ваш запрос обратно благодаря атрибуту вы поставите на первое место:
if(reply->request().attribute(QNetworkRequest::User).toString().contains("myRequest"))
// ...
НО: вам понадобится ваша собственная реализация для использования специальных атрибутов типа. Как вы могли прочитать в документации:
Реализация по умолчанию Network Access будет игнорировать любой запрос, атрибуты в этом диапазоне, и он не будет производить никаких атрибутов в этот диапазон в ответах. Диапазон зарезервирован для расширений QNetworkAccessManager.
Короче говоря, вам нужно будет создать подкласс QNetworkAccessManager использовать QNetworkRequest::User
и QNetworkRequest::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 = 1000
к QNetworkRequest::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