<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://doc.qtfr.org/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Documentation Qtfr - class_QPointer</title>
  <link>http://doc.qtfr.org/</link>
  <description>La documentation francophone sur Qt</description>
  <language>fr</language>
  <pubDate>Thu, 03 Sep 2009 16:42:30 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Etendre le type QVariant</title>
    <link>http://doc.qtfr.org/post/2007/02/19/Etendre-le-type-QVariant</link>
    <guid isPermaLink="false">urn:md5:060bddd9917af28f0dd0b18fff8b6bae</guid>
    <pubDate>Mon, 19 Feb 2007 22:53:00 +0100</pubDate>
    <dc:creator>IrmatDen</dc:creator>
        <category>Tutoriels</category>
        <category>class_QPointer</category><category>class_QVariant</category><category>type</category><category>version_Qt4</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Comment étendre QVariant avec ses propres objets&amp;nbsp;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce tutoriel va nous montrer comment étendre QVariant avec ses propres types.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Qt4 &lt;br /&gt;
&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: Denys Bulant (&lt;a href=&quot;http://forum.qtfr.org/profile.php?id=291&quot;&gt;IrmatDen&lt;/a&gt;)&lt;/p&gt;    &lt;h3&gt;Introduction&lt;/h3&gt;


&lt;p&gt;&lt;code&gt;QVariant&lt;/code&gt; 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&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connaître le nom du type (facile ;-) )&lt;/li&gt;
&lt;li&gt;Dans le cas d’une classe, elle doit répondre aux contraintes suivantes&amp;nbsp;:
&lt;ul&gt;
&lt;li&gt;avoir un constructeur par défaut public (ne prenant aucun argument, ou tous les arguments ayant une valeur par défaut),&lt;/li&gt;
&lt;li&gt;avoir un constructeur par copie public (c-a-d &lt;code&gt;MaClasse(const MaClasse&amp;amp;)&lt;/code&gt; ),&lt;/li&gt;
&lt;li&gt;avoir un destructeur public.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il suffit d’ajouter la macro &lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.2/qmetatype.html#Q_DECLARE_METATYPE&quot; hreflang=&quot;en&quot;&gt;Q_DECLARE_METATYPE(type)&lt;/a&gt;&lt;/code&gt;, après avoir inclus &lt;code&gt;QVariant&lt;/code&gt;, 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.&lt;/p&gt;



&lt;h3&gt;Exemple&lt;/h3&gt;


&lt;p&gt;Voici un exemple illustrant cette fonctionnalité. Imaginons que nous voulions nous servir de &lt;code&gt;QVariant&lt;/code&gt; pour transmettre les données d’un type &lt;code&gt;Vector3&lt;/code&gt; défini dans une lib tierce (bien que les sources soient fournis ici pour éviter les multiples projets...).&lt;/p&gt;



&lt;h4&gt;Vector3&lt;/h4&gt;


&lt;p&gt;Ce type est défini dans le fichier suivant vector3.h.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#ifndef VECTOR3_H&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#define VECTOR3_H&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; Vector3
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:
    Vector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; : m_x&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0.0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, m_y&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0.0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, m_z&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0.0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
    Vector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;float&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;float&lt;/span&gt; y, &lt;span style=&quot;color: #0000ff;&quot;&gt;float&lt;/span&gt; z&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; : m_x&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;x&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, m_y&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;y&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, m_z&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;z&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
    Vector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; Vector3 &amp;amp;v&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; : m_x&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;v.&lt;span style=&quot;color: #00eeff;&quot;&gt;m_x&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, m_y&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;v.&lt;span style=&quot;color: #00eeff;&quot;&gt;m_y&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, m_z&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;v.&lt;span style=&quot;color: #00eeff;&quot;&gt;m_z&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
    ~Vector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;float&lt;/span&gt; getX&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; m_x; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;float&lt;/span&gt; getY&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; m_y; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;float&lt;/span&gt; getZ&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; m_z; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; setX&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;float&lt;/span&gt; x&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt; m_x = x; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; setY&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;float&lt;/span&gt; y&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt; m_y = y; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; setZ&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;float&lt;/span&gt; z&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt; m_z = z; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:
    &lt;span style=&quot;color: #0000ff;&quot;&gt;float&lt;/span&gt; m_x, m_y, m_z;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// S'il s'agissait de votre propre classe et que vous vouliez la coupler pour de bon à Qt,&lt;/span&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// vous voudriez très probablement ajouter ces 2 lignes:&lt;/span&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// #include &amp;lt;QVariant&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// Q_DECLARE_METATYPE(Vector3);&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#endif&lt;/span&gt;&lt;/pre&gt;


&lt;h4&gt;Utilisation de Vector3 avec QVariant&lt;/h4&gt;


&lt;p&gt;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é.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;iostream&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;string&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;QVariant&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;quot;vector3.h&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// Nous enregistrons le type Vector3 pour son utilisation avec QVariant&lt;/span&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// seulement nécessaire si ce n'est pas déjà dans le fichier d'en-tête&lt;/span&gt;
Q_DECLARE_METATYPE&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;Vector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;namespace&lt;/span&gt; std;
&lt;span style=&quot;color: #0000ff;&quot;&gt;inline&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; displayVector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; string &amp;amp;name, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; Vector3 &amp;amp;v&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000dd;&quot;&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; name &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;={&amp;quot;&lt;/span&gt;
        &amp;lt;&amp;lt; v.&lt;span style=&quot;color: #00eeff;&quot;&gt;getX&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;,&amp;quot;&lt;/span&gt;
        &amp;lt;&amp;lt; v.&lt;span style=&quot;color: #00eeff;&quot;&gt;getY&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;,&amp;quot;&lt;/span&gt;
        &amp;lt;&amp;lt; v.&lt;span style=&quot;color: #00eeff;&quot;&gt;getZ&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;}&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; endl;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; main&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; argc, &lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt; **argv&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
    Vector3 v1&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;1.0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;1.0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    displayVector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;string&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;v1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, v1&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    QVariant var;
    var.&lt;span style=&quot;color: #00eeff;&quot;&gt;setValue&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;v1&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;span style=&quot;color: #ff0000;&quot;&gt;// var contient donc maintenant v1(1.0, 1.0, 0.5);&lt;/span&gt;
    Vector3 v2&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;5.0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0.75&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0.25&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    displayVector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;string&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;v2a&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, v2&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    v2 = var.&lt;span style=&quot;color: #00eeff;&quot;&gt;value&lt;/span&gt;&amp;lt;Vector3&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;span style=&quot;color: #ff0000;&quot;&gt;// récupération dans v2 du Vector3 contenu dans var (ie v1)&lt;/span&gt;
    displayVector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;string&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;v2b&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, v2&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #0000dd;&quot;&gt;cin&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;



&lt;h4&gt;Centralisons un peu&lt;/h4&gt;


&lt;p&gt;Voilà une première façon de faire. La récupération du &lt;code&gt;Vector3&lt;/code&gt; contenu dans le &lt;code&gt;QVariant&lt;/code&gt; 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.&lt;/p&gt;


&lt;p&gt;En voici un exemple&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#ifndef DECL_METATYPE_H&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#define DECL_METATYPE_H&lt;/span&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// Doit être inclus pour la macro Q_DECLARE_METATYPE et la définition de la classe Helper&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;QVariant&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// Pour que Vector3 soit un type connu...&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;quot;vector3.h&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// Nous enregistrons le type Vector3 pour son utilisation avec QVariant&lt;/span&gt;
Q_DECLARE_METATYPE&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;Vector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// Namespace ajoutant des fonctions de conversion à partir de QVariant&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;namespace&lt;/span&gt; QVariantHelper
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;inline&lt;/span&gt; Vector3 ToVector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QVariant v&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; v.&lt;span style=&quot;color: #00eeff;&quot;&gt;value&lt;/span&gt;&amp;lt;Vector3&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&lt;span style=&quot;color: #339900;&quot;&gt;#endif&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;La seule modification à apporter au main serait la suivante&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;...&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;
    Vector3 v2&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;5.0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0.75&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0.25&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    displayVector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;string&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;v2a&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, v2&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;// remplace l'utilisation d'un template par quelque chose&lt;/span&gt;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;// de plus significatif (à mes yeux... ;))&lt;/span&gt;
    v2 = QVariantHelper::&lt;span style=&quot;color: #00eeff;&quot;&gt;ToVector3&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;var&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    displayVector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;string&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;v2b&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, v2&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;...&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;



&lt;h4&gt;Et les pointeurs&amp;nbsp;?&lt;/h4&gt;


&lt;p&gt;Quid des pointeurs vers des types personnalisés?&lt;/p&gt;


&lt;p&gt;Eux aussi sont transformables en &lt;code&gt;QVariant&lt;/code&gt;. Il suffit de les déclarer comme type eux aussi. En voici un exemple&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#ifndef DECL_METATYPE_H&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#define DECL_METATYPE_H&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;QVariant&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;quot;vector3.h&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// Nous enregistrons le type Vector3 pour son utilisation avec QVariant&lt;/span&gt;
Q_DECLARE_METATYPE&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;Vector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// ... ainsi que le type pointeur vers Vector3&lt;/span&gt;
Q_DECLARE_METATYPE&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;Vector3*&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// Namespace ajoutant des fonctions de conversion à partir de QVariant&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;namespace&lt;/span&gt; QVariantHelper
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;// renvoit le Vector3 contenu dans v, ou le Vector3 par défaut&lt;/span&gt;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;// si la conversion n'est pas faisable&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;inline&lt;/span&gt; Vector3 ToVector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QVariant v&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; v.&lt;span style=&quot;color: #00eeff;&quot;&gt;value&lt;/span&gt;&amp;lt;Vector3&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;// renvoit le Vector3* contenu dans v, ou 0 si la conversion n'est pas faisable&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;inline&lt;/span&gt; Vector3* ToVector3Ptr&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QVariant v&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; v.&lt;span style=&quot;color: #00eeff;&quot;&gt;value&lt;/span&gt;&amp;lt;Vector3*&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&lt;span style=&quot;color: #339900;&quot;&gt;#endif&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Et voici l’assignation d’un pointeur à &lt;code&gt;QVariant&lt;/code&gt; et son extraction&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;...&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;
    QVariant varVec3;
    varVec3.&lt;span style=&quot;color: #00eeff;&quot;&gt;setValue&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;v1&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    QVariant varVec3Ptr = QVariant::&lt;span style=&quot;color: #00eeff;&quot;&gt;fromValue&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;amp;v1&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;span style=&quot;color: #ff0000;&quot;&gt;// Notation générique alternative pour l'assignation d'une valeur à un QVariant&lt;/span&gt;
    Vector3 v2&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;5.0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0.75&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;0.25&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    displayVector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;string&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;v2a&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, v2&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    v2 = QVariantHelper::&lt;span style=&quot;color: #00eeff;&quot;&gt;ToVector3&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;varVec3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    displayVector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;string&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;v2b&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, v2&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    Vector3 *v3 = QVariantHelper::&lt;span style=&quot;color: #00eeff;&quot;&gt;ToVector3Ptr&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;varVec3Ptr&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;// TOUJOURS vérifier si v3 est valide avant utilisation !&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;v3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
        displayVector3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;string&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;v3(ptr)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, *v3&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;
        &lt;span style=&quot;color: #0000dd;&quot;&gt;cout&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;v3 is an invalid pointer to Vector3!&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; endl;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#91;&lt;/span&gt;...&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Et enfin, si votre type est une classe dérivant de &lt;code&gt;QObject&lt;/code&gt;, vous devez utiliser &lt;code&gt;QPointer&lt;/code&gt;&amp;nbsp;: en effet, &lt;code&gt;QObject&lt;/code&gt; n'a pas de constructeur par copie.&lt;/p&gt;


&lt;p&gt;Pour cela, il faut juste déclarer le metatype avec le &lt;code&gt;QPointer&lt;/code&gt; représentant votre classe (ie &lt;code&gt;Q_DECLARE_METATYPE(QPointer&amp;lt;MyObject&amp;gt;)&lt;/code&gt;) en plus des déclarations de &lt;code&gt;MyObject&lt;/code&gt; et &lt;code&gt;MyObject*&lt;/code&gt;.&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt;&amp;nbsp;: &lt;code&gt;QPointer&amp;lt;VotreClasse&amp;gt;&lt;/code&gt; et &lt;code&gt;VotreClasse*&lt;/code&gt; sont incompatibles&amp;nbsp;!&lt;/p&gt;&lt;/blockquote&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>