2016-05-18 7 views

Antwort

3

Zuerst werden beide zum Setzen von Attributen auf QNetWorkRequest über die Methode setAttribute(Attribute code, const QVariant &value) verwendet. Wenn Sie zum Beispiel zwei Funktionen haben, die eine QNetworkRequest mit derselben URL initiieren, aber die Daten anders verwenden und wissen müssen, woher die QNetworkRequest stammt, dann müssen Sie ein Attribut verwenden.

Zuerst stellen Sie das Attribut auf Ihre Anfrage:

request->setAttribute(QNetworkRequest::User, QVariant("myRequest")); 

Und dann Sie Ihre Anfrage zurück durch das Attribut, das Sie in den ersten Platz erhalten:

if(reply->request().attribute(QNetworkRequest::User).toString().contains("myRequest")) 
// ... 

ABER: Sie benötigen eine eigene Implementierung, um spezielle Typattribute zu verwenden. Wie Sie in der Dokumentation gelesen haben könnten:

Die Standardimplementierung von Network Access wird jeden Antrag Attribute in diesem Bereich ignorieren und es wird keine Attribute in diesen Bereich in Antworten produzieren. Der Bereich ist für Erweiterungen von QNetworkAccessManager reserviert.

Kurz gesagt, müssen Sie QNetworkAccessManager Unterklasse QNetworkRequest::User und QNetworkRequest::UserMax Attribute zu verwenden. Hier ist ein sehr einfaches Beispiel:

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; 
    } 
}; 

nun über den Unterschied zwischen den beiden: gibt es keine. Sie sind das Gleiche. QNetworkRequest::UserMax ist nur eine obere Grenze.

Tat QNetworkRequest::Attribute ist ein enum, und Sie werden eine breite Palette von kundenspezifischen Werte zur Verfügung gestellt, QNetworkRequest::User = 1000-QNetworkRequest::UserMax = 32767 gehen. So können Sie dies tun, wenn Sie Attribute auf Ihre Wünsche einstellen:

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: Obwohl Attribute nützlich scheinen, möchten Sie vielleicht setProperty(const char *name, const QVariant &value) für die meisten Fälle verwenden. Tatsächlich sind Attribute nicht dazu da, Speicher für benutzerdefinierte Daten bereitzustellen, im Gegensatz zu dynamischen Eigenschaften.

+0

vielen Dank, "Attribute sind nicht da, um Speicher für benutzerdefinierte Daten bereitzustellen", für was? – iMath

+0

Nun, sie sind hier, um die Anfrage, die Sie senden, zu kontrollieren, und auch um die Informationen aus der Antwort, die Sie erhalten, zu kontrollieren. Ihr Hauptziel ist es daher nicht, Daten für die Anfrage zu speichern, sondern nur Informationen darüber zu geben. – IAmInPLS

+0

Ich benutze QT5 und es scheint, dass ** QNetworkRequest ** ist kein Nachkomme von ** QObject ** und so ist die 'setProperty' Methode nicht verfügbar. (Aber 'setAttribute' ist verfügbar ...) – gregn3

Verwandte Themen