Forum QtFR

La communauté francophone Qt

Vous n'êtes pas identifié(e).

Annonce

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

#1 24-06-2011 13:21:56

dergen
Webmaster Qt
Lieu : Meaux
Inscription : 20-03-2009
Messages : 2 240
Site Web

Etendre le type QVariant

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

Pied de page des forums


Sitemap QtFR