2010-07-07 11 views
6

Estoy escribiendo código de prueba que iterará automáticamente a través de todos los Q_PROPERTY de widgets y algunas propiedades están usando tipos que están registrados a través de qRegisterMetaType. Si quiero leer/escribir estos en QVariant, necesito usar QVariant :: UserType al almacenarlos en variante. Hasta aquí todo bien.Cómo verificar QVariant de tipo QVariant :: UserType es el tipo esperado?

Pero cuando quiero probar lecturas y escrituras de estas propiedades, también necesito saber su tipo. Para cosas que ya son tipos de qt estándar, puedo hacerlo a través de QVariant :: type() pero como tengo muchos tipos de uso, ¿cómo se lograría esto?

de la API de QVariant, manchado este:

bool QVariant::canConvert (Type t) const

Pero estoy un poco dudoso que esto dará lugar a tipos incorrectos en el caso de las enumeraciones?

Entonces, ¿cuál sería la forma infalible de verificar qué tipo de tipo de usuario se almacena en QVariant?

Respuesta

11

Para los tipos definidos por el usuario hay QVariant::userType(). Funciona como QVariant :: type() pero devuelve el entero de id de tipo del tipo definido por el usuario, mientras que QVariant :: type() siempre devuelve QVariant :: UserType. También hay QVariant::typeName() que devuelve el nombre del tipo como una cadena.

EDIT:

Probablemente depende de cómo haya configurado el QVariant. Se desaconseja usar directamente QVariant::QVariant(int type, const void * copy).

Decir que tengo tres tipos como este:

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

     MyFirstType(const QString &content); 

     QString content() const; 

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

El tercer y sin Q_DECLARE_METATYPE

que los almacena en 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(); 

[...] 

me sale:

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

Sin embargo , parece que en el caso de QVarian t :: UserType variant, typeName() devuelve "UserType" y typeName() devuelve QVariant :: UserType enum value. Entonces, ambos son inútiles. – rasjani

+0

Los tiempos de los objetos están bien, puedo hacer la verificación también con el encasillado de modo que su ejemplo también funcione de forma adecuada. Pero mi pregunta era sobre enum, que no es un tipo de clase y se puede convertir de manera reproducible cualquier variable numérica en una enumeración. Pero como dije. Verificare tu código. – rasjani

+0

Ah, lo siento, no me di cuenta de esa parte. Intenté y parece que es posible registrar un tipo de enumeración con Q_DECLARE_METATYPE o qRegisterMetaType y usarlo de la misma manera. Los documentos solo hablan de clase o estructura con el constructor predeterminado público, el constructor de copia y el destructor, por lo que no estoy del todo seguro, pero creo que debería funcionar para cualquier tipo que tenga la misma interfaz implícita para creación, copia y destrucción. – Leiaz

Cuestiones relacionadas