2016-05-18 13 views

ответ

3

Во-первых, оба используются для установки атрибутов на 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) для большинства случаев. В самом деле, атрибутов нет, чтобы обеспечить хранение пользовательских данных, в отличие от динамических свойств.

+0

большое спасибо, «атрибутов нет, чтобы обеспечить хранение пользовательских данных», то для чего? – iMath

+0

Ну, они здесь, чтобы контролировать отправленный вами запрос, а также контролировать информацию из полученного вами ответа. Таким образом, их основная цель - не хранить данные для запроса, просто предоставить информацию об этом. – IAmInPLS

+0

Я использую QT5, и кажется, что ** QNetworkRequest ** не является потомком ** QObject **, поэтому метод 'setProperty' на нем недоступен. (Но 'setAttribute' доступен ...) – gregn3

 Смежные вопросы

  • Нет связанных вопросов^_^