Vous n'êtes pas identifié(e).
Qt 4: 4.8.4 - Qt 5: 5.0.2 - Qt Creator: 2.7.0 - Qt Installer: 1.3.0 - VS Qt 4: 1.1.11 - VS Qt 5: 1.2.1 - Monkey Studio: 1.9.0.4
Pages : 1
Introduction
QVariant est un type très puissant permettant de stocker n’importe quel type de variable sous une forme abstraite. Depuis Qt4, il est possible d’y rajouter ses propres types, ainsi que celui de librairies tierces. Il y a 2 restrictions :
Connaître le nom du type (facile ;-) )
Dans le cas d’une classe, elle doit répondre aux contraintes suivantes :
avoir un constructeur par défaut public (ne prenant aucun argument, ou tous les arguments ayant une valeur par défaut),
avoir un constructeur par copie public (c-a-d MaClasse(const MaClasse&) ),
avoir un destructeur public.
Il suffit d’ajouter la macro Q_DECLARE_METATYPE(type), après avoir inclus QVariant, et après la déclaration du type. Si le type à gérer est déclaré dans un en-tête que vous ne pouvez/voulez pas toucher (celui d’une bibliothèque tierce par exemple), il suffit de la saisir quelque part après l’inclusion dudit en-tête.
Exemple
Voici un exemple illustrant cette fonctionnalité. Imaginons que nous voulions nous servir de QVariant pour transmettre les données d’un type Vector3 défini dans une lib tierce (bien que les sources soient fournis ici pour éviter les multiples projets...).
Vector3
Ce type est défini dans le fichier suivant vector3.h.
Utilisation de Vector3 avec QVariant
Pas grand chose à expliquer ci-dessous, la doc citée en début de document illustre la conversion vers et à partir d’un QVariant avec type personnalisé.
Centralisons un peu
Voilà une première façon de faire. La récupération du Vector3 contenu dans le QVariant se fait à l’aide d’une fonction template. Pour rendre les choses un peu plus lisible, et/ou si vous prévoyez de gérer un certain nombre de classes de cette façon, on peut tout simplement mettre ces macros à part, et regrouper les méthodes de conversion QVariant vers type personnalisé avec.
En voici un exemple :
La seule modification à apporter au main serait la suivante :
Et les pointeurs ?
Quid des pointeurs vers des types personnalisés?
Eux aussi sont transformables en QVariant. Il suffit de les déclarer comme type eux aussi. En voici un exemple :
Et voici l’assignation d’un pointeur à QVariant et son extraction :
Et enfin, si votre type est une classe dérivant de QObject, vous devez utiliser QPointer : en effet, QObject n'a pas de constructeur par copie.
Pour cela, il faut juste déclarer le metatype avec le QPointer représentant votre classe (ie Q_DECLARE_METATYPE(QPointer<MyObject>)) en plus des déclarations de MyObject et MyObject*.
Attention : QPointer<VotreClasse> et VotreClasse* sont incompatibles !
Sans la liberté de blâmer, il n'est point d'éloge flatteur; et qu'il n'y a que les petits hommes qui redoutent les petits écrits !!!
- Beaumarchais -
Hors ligne
Pages : 1
| Liens interne à QtFR | Les partenaires de QtFR | Liens pour les sites officiels Qt | Liens sur les ressources Qt |
|---|---|---|---|
| Communauté QtFR sur Google+ | Monkey Studio | Télécharger Qt | Notre tutoriel |
| QtFR sur Twitter | ZeGrapher | Site officiel Qt | Documentation Qt |
| IRC box | Qt Blog | Qt Centre | |
| Galeries | Qt Wiki | Qt Apps | |
| Contactez-nous | Qt Quarterly |