Comment vérifier QVariant de type QVariant :: UserType est le type prévu?

StackOverflow https://stackoverflow.com/questions/3193275

  •  02-10-2019
  •  | 
  •  

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?

Était-ce utile?

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 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top