2010-07-07 8 views
6

Sto scrivendo il codice di test che verrà automaticamente ripetuto attraverso tutti i Q_PROPERTY di widget e alcune proprietà stanno utilizzando tipi registrati tramite qRegisterMetaType. Se voglio leggere/scrivere questi in QVariant ho bisogno di usare QVariant :: UserType quando li memorizzi in una variante. Fin qui tutto bene.Come verificare QVariant di tipo QVariant :: UserType è un tipo previsto?

Ma quando voglio testare le letture e le scritture di queste proprietà, ho bisogno di conoscere anche il loro tipo. Per cose che sono già tipi qt standard, posso farlo tramite QVariant :: type() ma dato che ho un sacco di tipi utente, come si farebbe?

dalle API di QVariant, ho notato questo:

bool QVariant::canConvert (Type t) const

ma io sono un po 'dubbio se questo porterà a tipi sbagliati in caso di enumerazioni?

Quindi, quale sarebbe il modo infallibile per verificare quale tipo di utente è memorizzato in QVariant?

risposta

11

Per i tipi definiti dall'utente è QVariant::userType(). Funziona come QVariant :: type() ma restituisce il tipo id intero del tipo definito dall'utente mentre QVariant :: type() restituisce sempre QVariant :: UserType.

C'è anche QVariant::typeName() che restituisce il nome del tipo come una stringa.

EDIT:

Probabilmente dipende da come si imposta il QVariant. L'utilizzo diretto di QVariant::QVariant(int type, const void * copy) è sconsigliato.

Dire che ho tre tipi come questo:

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

     MyFirstType(const QString &content); 

     QString content() const; 

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

Il terzo senza Q_DECLARE_METATYPE

li devo conservare 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(); 

[...] 

ottengo:

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

Tuttavia , sembra che nel caso di QVarian t :: Variante UserType, il metodo typeName() restituisce "UserType" e typeName() restituisce il valore enumerativo QVariant :: UserType. Quindi entrambi sono inutili – rasjani

+0

I tempi degli oggetti vanno bene, posso fare il controllo anche con typecasting così il tuo esempio funziona anche bene. Ma la mia domanda riguardava enum, che non è un tipo di classe e si può tipicamente digitare qualsiasi variabile numerica in un enum. Ma come detto. Controllerò il tuo codice. – rasjani

+0

Ah, scusa, non ho notato quella parte. Ho provato e sembra che sia possibile registrare un tipo enum con Q_DECLARE_METATYPE o qRegisterMetaType e usarlo allo stesso modo. I documenti parlano solo di classe o struct con costruttore pubblico, costruttore e distruttore di copia, quindi non ne sono completamente sicuro, ma penso che dovrebbe funzionare per qualsiasi tipo che abbia la stessa interfaccia implicita per creazione, copia e distruzione. – Leiaz