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.
vielen Dank, "Attribute sind nicht da, um Speicher für benutzerdefinierte Daten bereitzustellen", für was? – iMath
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
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