Comment vérifier QVariant de type QVariant :: UserType est le type prévu?
Question
Je l'écriture de code de test qui itérer automatiquement à travers tous les Q_PROPERTY de widgets et de certaines propriétés utilisent des types qui sont enregistrés via qRegisterMetaType. Si je veux lire / écrire ces derniers dans QVariant j'utiliser QVariant :: UserType lors de leur stockage en variante. Jusqu'à présent, si bon.
Mais quand je veux lit tester et écrit de ces propriétés, je dois savoir aussi leur type. Pour des choses qui sont déjà standards types qt, je peux le faire via QVariant :: type (), mais comme j'ai beaucoup de usertypes, comment cela serait-il accompli?
De l'api de QVariant, je repéré ceci:
bool QVariant::canConvert ( Type t ) const
Mais je suis un peu douteux que cela conduira à mauvais types en cas d'énumérations?
Alors, quel serait le moyen infaillible de vérifier quel type de usertype est stocké dans QVariant?
La solution
Pour les types définis par l'utilisateur, il est QVariant :: userType () . Il fonctionne comme QVariant :: type () mais retourne l'entier identifiant de type de l'utilisateur type défini alors QVariant :: type () retourne toujours QVariant :: UserType.
Il y a aussi QVariant :: typeName () qui retourne le nom du type comme une chaîne.
EDIT:
Cela dépend probablement de la façon dont vous définissez la QVariant. Directement à l'aide QVariant :: QVariant (type int, copie vide const *) est découragée.
Dire que j'ai trois types comme ceci:
class MyFirstType
{
public:
MyFirstType();
MyFirstType(const MyFirstType &other);
~MyFirstType();
MyFirstType(const QString &content);
QString content() const;
private:
QString m_content;
};
Q_DECLARE_METATYPE(MyFirstType);
Le troisième sans Q_DECLARE_METATYPE
Je les stocker dans 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();
[...]
J'obtenir:
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