<?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_QObject</title>
  <link>http://doc.qtfr.org/</link>
  <description>La documentation francophone sur Qt</description>
  <language>fr</language>
  <pubDate>Thu, 06 Nov 2008 23:03:54 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Création de plugin avec Qt</title>
    <link>http://doc.qtfr.org/post/2007/02/18/Creation-de-plugin-avec-Qt</link>
    <guid isPermaLink="false">urn:md5:4d399514496b47bcf3234ec8055de61f</guid>
    <pubDate>Sun, 18 Feb 2007 23:11:00 +0100</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Tutoriels</category>
        <category>class_QObject</category><category>class_QPluginLoader</category><category>plugin</category><category>version_Qt4</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Comment créer des plugins avec Qt&amp;nbsp;? et de manière multi-plateforme&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment permettre à mes utilisateurs d'étendre eux-mêmes mon application&amp;nbsp;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce tutoriel va nous détailler la création d'un système de plugins avec la bibliothèque Qt, et le chargement de ces plugins depuis notre application.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Qt4 (supérieur ou égal à Qt 4.1) &lt;br /&gt;
&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: Nicolas Arnaud-Cormos (&lt;a href=&quot;http://forum.qtfr.org/profile.php?id=7&quot;&gt;nikikko&lt;/a&gt;) &lt;br /&gt;
&lt;strong&gt;Test&lt;/strong&gt;&amp;nbsp;: Linux (Qt 4.1, 4.2)&lt;/p&gt;    &lt;h3&gt;Plugin, vous avez dit plugin&amp;nbsp;?&lt;/h3&gt;


&lt;h4&gt;Qu'est-ce que c'est&amp;nbsp;?&lt;/h4&gt;


&lt;p&gt;Je n'ai pas réussit à faire mieux que &lt;a href=&quot;http://fr.wikipedia.org/wiki/Plugin&quot; hreflang=&quot;fr&quot;&gt;Wikipedia&lt;/a&gt; pour la définition&amp;nbsp;:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;En informatique, un plugin ou plug-in, de l'anglais to plug in (brancher), parfois traduit en module externe, module enfichable, module d'extension, greffon ou plugiciel, est un logiciel tiers venant se greffer à un logiciel principal afin de lui apporter de nouvelles fonctionnalités. Le logiciel principal fixe un standard d'échange d'informations auquel ses modules se conforment. Le module n'est généralement pas conçu pour fonctionner seul mais avec un autre programme.&lt;/p&gt;&lt;/blockquote&gt;



&lt;h4&gt;Comment ça marche&amp;nbsp;?&lt;/h4&gt;


&lt;p&gt;C'est relativement simple (en théorie ;))&amp;nbsp;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Le logiciel principal défini une API standard&amp;nbsp;: un ensemble de classes et de fonctions pouvant être utilisées/héritées par les plugins. C'est le lien, le langage commun entre le logiciel principal et les plugins.&lt;/li&gt;
&lt;li&gt;Les plugins se basent sur cette API, et créent ainsi de nouvelles fonctionnalités pour le logiciel principal. Ils se présentent généralement sous forme de bibliothèques dynamiques (*.dll sous Windows ou *.so sous Linux). Pour pouvoir être chargés par le programme principal, ils doivent être copiés dans un répertoire spécifique.&lt;/li&gt;
&lt;li&gt;Le logiciel principal, au démarrage, charge les plugins qu'il trouve, ajoutant ainsi de nouvelles fonctionnalités.&lt;/li&gt;
&lt;/ol&gt;


&lt;h4&gt;Avantages&amp;nbsp;?&lt;/h4&gt;


&lt;p&gt;Les avantages d'un système de plugins sont nombreux. En voici quelques uns&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;l'utilisateur ou un intervenant externe peut étendre les fonctionnalités d'une application sans avoir son code source,&lt;/li&gt;
&lt;li&gt;le logiciel est beaucoup plus modulaire&amp;nbsp;: possibilité de faire des versions réduite, version complète...&lt;/li&gt;
&lt;li&gt;la mise en place d'un système de plugin force à réfléchir un peu à l'architecture du logiciel, ce qui n'est pas un mal ;)&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Les plugins avec Qt&amp;nbsp;? (pourquoi c'est pratique)&lt;/h4&gt;


&lt;p&gt;La mise en place d'un système de plugin est parfois assez lourde et nécessite par exemple de vérifier dans le programme principal si un plugin contient telle ou telle fonction. Je ne parle même pas d'un système multi-plateforme... heureusement, Qt est là.&lt;/p&gt;


&lt;p&gt;Grâce à Qt, la réalisation d'un système de plugins multi-plateforme est relativement simple&amp;nbsp;: &lt;a href=&quot;http://doc.trolltech.com/4.2/plugins-howto.html&quot; hreflang=&quot;en&quot;&gt;la documentation Qt sur le système de plugins&lt;/a&gt;.&lt;/p&gt;



&lt;h3&gt;CalcOp&lt;/h3&gt;


&lt;p&gt;Pour illustrer la création de plugin, nous allons utiliser un exemple assez simple&amp;nbsp;: un petit projet que j'ai nommé &lt;code&gt;calcop&lt;/code&gt;, et qui permet à partir de 1, 2 ou 3 variables, d'effectuer une opération au choix de l'utilisateur (par exemple des additions, multiplications, remplacement de caractères dans une chaîne...).&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://doc.qtfr.org/public/2006/calcop1.png&quot;&gt;&lt;img src=&quot;http://doc.qtfr.org/public/2006/.calcop1_t.jpg&quot; alt=&quot;calcop1.png&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://doc.qtfr.org/public/2006/calcop2.png&quot;&gt;&lt;img src=&quot;http://doc.qtfr.org/public/2006/.calcop2_t.jpg&quot; alt=&quot;calcop2.png&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;http://doc.qtfr.org/public/2006/calcop3.png&quot;&gt;&lt;img src=&quot;http://doc.qtfr.org/public/2006/.calcop3_t.jpg&quot; alt=&quot;calcop3.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ça ne sert à rien, mais le principal c'est que l'exemple est très simple, il permet donc de se concentrer sur le code lié à la gestion de plugin. Le code source est livré avec deux plugins&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un plugin contenant des opérations mathématiques (addition, multiplication, division, soustraction, factoriel)&lt;/li&gt;
&lt;li&gt;un plugin contenant des opérations sur les chaînes (inversion de sens et remplacement dans une chaîne)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les sources du logiciel sont téléchargeables &lt;a href=&quot;http://doc.qtfr.org/public/2006/calcop-0.2.tar.gz&quot;&gt;ici&lt;/a&gt;. Je vous conseille de les télécharger avant de vous lancer dans la lecture du tutoriel.&lt;/p&gt;



&lt;h4&gt;Le programme principal&lt;/h4&gt;


&lt;p&gt;Le programme principal est relativement simple. Je ne vais pas détailler tout le code, mais je vais me focaliser sur les parties nécessaires à la mise en place de plugins.&lt;/p&gt;


&lt;p&gt;La première chose à faire, c'est de définir un ensemble d'interfaces à nos plugins&amp;nbsp;: ce sont des classes avec seulement des fonctions virtuelles pures utilisées pour dialoguer entre l'application et les plugins. Il est possible bien entendu de définir plusieurs interfaces, pour différents types de plugin, mais dans notre cas nous n'en définissons qu'une seule, OperationInterface&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; OperationInterface
&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;:
    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; ~OperationInterface&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;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; QStringList operationList&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: #0000dd;&quot;&gt;0&lt;/span&gt;;
    virtualbool canCalculate&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt; QString opName &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; = &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;;
    virtualint numVariable&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt; QString opName &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; = &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; QString calculate&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt; QString opName, QStringList variableList &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&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;;
Q_DECLARE_INTERFACE&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;OperationInterface,
                    &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;org.nikikko.CalcOp.OperationInterface/1.0&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;La macro &lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.1/qtplugin.html#Q_DECLARE_INTERFACE&quot; hreflang=&quot;en&quot;&gt;Q_DECLARE_INTERFACE&lt;/a&gt;&lt;/code&gt; permet d'indiquer lors de la compilation (à l'outil &lt;code&gt;moc&lt;/code&gt;, le précompilateur Qt) que cette classe est une interface.&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt;&amp;nbsp;: le deuxième élément de la macro &lt;code&gt;&quot;org.nikikko.CalcOp.OperationInterface&quot;&lt;/code&gt; doit obligatoirement se finir par le nom de la classe (je me suis fait avoir au début).&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Le reste du code, notamment la classe &lt;code&gt;OperationManager&lt;/code&gt;, sera détaillé par la suite.&lt;/p&gt;



&lt;h4&gt;Création d'un plugin&lt;/h4&gt;


&lt;p&gt;La création du plugin est relativement simple. Il suffit de créer une classe qui hérite de notre interface &lt;code&gt;OperationInterface&lt;/code&gt;. Voici par exemple le code pour le plugin mathématique&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;QObject&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;operationinterface.h&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; MathPlugin : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QObject, &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; OperationInterface
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
Q_OBJECT
Q_INTERFACES&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;OperationInterface&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:
    QStringList operationList&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;bool&lt;/span&gt; canCalculate&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt; QString opName &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; numVariable&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt; QString opName &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    QString calculate&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt; QString opName, QStringList variableList &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;/pre&gt;


&lt;p&gt;Deux remarques importantes&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;la classe de base d'un plugin (qui hérite d'une classe d'interface) doit toujours hériter de &lt;code&gt;QObject&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;toutes les fonctions de l'interface doivent être définies.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&amp;nbsp;: il est possible dans un plugin d'avoir une classe qui hérite de plusieurs interfaces, pour cela voir l'exemple plugandpaint de Qt.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Et dans le fichier source&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;Q_EXPORT_PLUGIN2&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;calcop_math, MathPlugin&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;La macro &lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.2/qpluginloader.html#Q_EXPORT_PLUGIN2&quot; hreflang=&quot;en&quot;&gt;Q_EXPORT_PLUGIN2&lt;/a&gt;&lt;/code&gt; indique au compilateur qu'il faut exporter cette classe, et que cette classe est le point d'entrée du plugin. Pour faire simple, une classe exportée est une classe qui est visible à l'extérieur de la bibliothèque (donc par le programme principal).&lt;/p&gt;


&lt;p&gt;Enfin, il faut indiquer dans le fichier .pro que l'on souhaite créer un plugin. Voici le fichier .pro correspondant au plugin calcop_math&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
  TEMPLATE      = lib
  CONFIG       += release plugin
  INCLUDEPATH  += ../../src
  HEADERS       = mathplugin.h
  SOURCES       = mathplugin.cpp
  TARGET        = calcop_math
  DESTDIR       = ../../bin/plugins
&lt;/pre&gt;


&lt;p&gt;Voilà quelques explications&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TEMPLATE = lib&lt;/code&gt;&amp;nbsp;: création d'une bibliothèque&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CONFIG += plugin&lt;/code&gt;&amp;nbsp;: cette bibliothèque est un plugin&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TARGET = calcop_math&lt;/code&gt;&amp;nbsp;: ce plugin s'appelle calcop_math (même nom que dans la macro &lt;code&gt;Q_EXPORT_PLUGIN2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DESTDIR = ../../bin/plugins&lt;/code&gt;&amp;nbsp;: mettre ce plugin dans le bon répertoire (répertoire des plugins de l'application)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voilà, c'est relativement simple à faire, et en plus c'est multi-plateforme.&lt;/p&gt;



&lt;h4&gt;Chargement des plugins dans l'application&lt;/h4&gt;


&lt;p&gt;Dernière étape, c'est le chargement des plugins dans l'application. Tout ce qui concerne la gestion des plugins se fait à travers la classe &lt;code&gt;OperationManager&lt;/code&gt; dans le programme principal. Cette classe charge les plugins, et s'occupe d'effectuer les appels nécessaires aux fonctions des plugins lors du calcul.&lt;/p&gt;


&lt;p&gt;Pour me faciliter la vie, j'ai décidé d'en faire un &lt;a href=&quot;http://fr.wikipedia.org/wiki/Singleton_%28motif_de_conception%29&quot; hreflang=&quot;fr&quot;&gt;singleton&lt;/a&gt;&amp;nbsp;: c'est pour ça que le constructeur est privé, et que la classe comporte une fonction membre statique instance. Mais le code le plus intéressant se trouve dans le constructeur de cette classe&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;QDir pluginsDir = QDir&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;qApp-&amp;gt;applicationDirPath&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;#41;&lt;/span&gt;;
    pluginsDir.&lt;span style=&quot;color: #00eeff;&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;plugins&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    foreach &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QString fileName, pluginsDir.&lt;span style=&quot;color: #00eeff;&quot;&gt;entryList&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QDir::&lt;span style=&quot;color: #00eeff;&quot;&gt;Files&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;#41;&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
        QPluginLoader loader&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;pluginsDir.&lt;span style=&quot;color: #00eeff;&quot;&gt;absoluteFilePath&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;fileName&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        QObject *plugin = loader.&lt;span style=&quot;color: #00eeff;&quot;&gt;instance&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;if&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;plugin&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;
            OperationInterface * op = qobject_cast&amp;lt;OperationInterface *&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;plugin&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&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;op&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_operationList &amp;lt;&amp;lt; op;
            &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: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Nous avons trois actions importantes dans ce code&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;déplacement dans le répertoire de plugin&amp;nbsp;: les deux premières lignes vont nous permettre d'aller dans le répertoire des plugins,&lt;/li&gt;
&lt;li&gt;chargement du plugin avec la classe &lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.2/qpluginloader.html&quot; hreflang=&quot;en&quot;&gt;QPluginLoader&lt;/a&gt;&lt;/code&gt;&amp;nbsp;: on vérifie que le plugin est bien compatible avec la version du logiciel et de Qt, et crée une instance de l'objet racine (qui est une classe héritée de l'interface, dans notre cas ce sera une instance de &lt;code&gt;MathPlugin&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;vérification de la compatibilité du plugin&amp;nbsp;: de quelle interface hérite-t-il (ici &lt;code&gt;OperationInterface&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si tout se passe bien, on enregistre le plugin dans la liste des opérations. Et voilà, c'est simple, clair et propre...&lt;/p&gt;


&lt;p&gt;La classe &lt;code&gt;QPluginLoader&lt;/code&gt; est au coeur de ce code&amp;nbsp;: c'est elle qui va se charger de créer une instance du plugin. Au passage, l'instance créé, que l'on récupère à l'aide de la fonction instance(), est statique&amp;nbsp;: si l'on utilise le même code dans une autre fonction, l'instance renvoyé sera toujours la même (ie le même pointeur).&lt;/p&gt;</description>
    
          <enclosure url="http://doc.qtfr.org/public/2006/calcop-0.2.tar.gz"
      length="11551" type="application/x-gzip" />
    
    
          <comments>http://doc.qtfr.org/post/2007/02/18/Creation-de-plugin-avec-Qt#comment-form</comments>
      <wfw:comment>http://doc.qtfr.org/post/2007/02/18/Creation-de-plugin-avec-Qt#comment-form</wfw:comment>
      <wfw:commentRss>http://doc.qtfr.org/feed/rss2/comments/46</wfw:commentRss>
      </item>
    
</channel>
</rss>