2010-07-07 13 views
6

Ich schreibe Testcode, der automatisch durch alle Widgets von Q_PROPERTY iteriert und einige Eigenschaften verwenden Typen, die über qRegisterMetaType registriert sind. Wenn ich diese in QVariant lesen/schreiben möchte, muss ich QVariant :: UserType verwenden, wenn ich sie in der Variante ablege. So weit, ist es gut.So überprüfen Sie QVariant vom Typ QVariant :: UserType erwartet Typ?

Aber wenn ich Lese- und Schreibvorgänge dieser Eigenschaften testen möchte, muss ich auch deren Typ kennen. Für Dinge, die bereits Standard-QT-Typen sind, kann ich dies über QVariant :: type() tun, aber da ich viele Benutzertypen habe, wie würde dies erreicht werden?

Vom api von QVariant, sah ich diese:

bool QVariant::canConvert (Type t) const

Aber ich bin ein wenig zweifelhaft, ob dies zu falschen Arten bei Aufzählungen führen wird?

Also, was wäre der idiotensichere Weg zu überprüfen, welche Art von Usertyp in QVariant gespeichert ist?

Antwort

11

Für benutzerdefinierte Typen gibt es QVariant::userType(). Es funktioniert wie QVariant :: type(), gibt aber die Typ-ID-Ganzzahl des benutzerdefinierten Typs zurück, während QVariant :: type() immer QVariant :: UserType zurückgibt.

Es gibt auch QVariant::typeName(), die den Namen des Typs als Zeichenfolge zurückgibt.

EDIT:

Es hängt wahrscheinlich, wie Sie den QVariant gesetzt. Direkte Verwendung von QVariant::QVariant(int type, const void * copy) wird abgeraten.

sagen, dass ich drei Typen wie dieses:

class MyFirstType 
{ 
    public: 
     MyFirstType(); 
     MyFirstType(const MyFirstType &other); 
     ~MyFirstType(); 

     MyFirstType(const QString &content); 

     QString content() const; 

    private: 
     QString m_content; 
}; 
Q_DECLARE_METATYPE(MyFirstType); 

Die dritte ohne Q_DECLARE_METATYPE

Ich speichere sie in QVariant:

QString content = "Test"; 

MyFirstType first(content); 

MySecondType second(content); 

MyThirdType third(content); 

QVariant firstVariant; 
firstVariant.setValue(first); 

QVariant secondVariant = QVariant::fromValue(second); 

int myType = qRegisterMetaType<MyThirdType>("MyThirdType"); 

QVariant thirdVariant(myType, &third); // Here the type isn't checked against the data passed 

qDebug() << "typeName for first :" << firstVariant.typeName(); 
qDebug() << "UserType :" << firstVariant.userType(); 
qDebug() << "Type : " << firstVariant.type(); 

[...] 

ich:

typeName for first : MyFirstType 
UserType : 256 
Type : QVariant::UserType 

typeName for second : MySecondType 
UserType : 257 
Type : QVariant::UserType 

typeName for third : MyThirdType 
UserType : 258 
Type : QVariant::UserType 
+0

jedoch scheint es im Fall von QVarian zu sein t :: UserType-Variante, typeName() -Methode gibt "UserType" zurück und typeName() gibt den Aufzählungswert QVariant :: UserType zurück. Also beide sind nutzlos – rasjani

+0

Objekt Zeiten sind in Ordnung, ich kann die Überprüfung auch mit Typumwandlung, so funktioniert Ihr Beispiel wahrscheinlich auch gut funktioniert. Aber meine Frage war über Enum's, die nicht ein Klassentyp ist und man kann eine numerische Variable in eine Enum schreiben. Aber wie gesagt. Ich überprüfe deinen Code. – rasjani

+0

Ah, tut mir leid, ich habe diesen Teil nicht bemerkt. Ich habe versucht und es sieht so aus, als ob es möglich ist, einen Enum-Typ mit Q_DECLARE_METATYPE oder qRegisterMetaType zu registrieren und es auf die gleiche Weise zu verwenden. Die Doktoren sprechen nur über Klasse oder Struktur mit öffentlichem Standardkonstruktor, Kopierkonstruktor und Destruktor, also bin ich mir nicht ganz sicher, aber ich denke, dass es für jeden Typ funktionieren sollte, der dieselbe implizite Schnittstelle für Erstellung, Kopie und Zerstörung hat. – Leiaz