<?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</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>Intégrer Ogre dans Qt 4</title>
    <link>http://doc.qtfr.org/post/2009/04/04/Integrer-Ogre-dans-Qt-4</link>
    <guid isPermaLink="false">urn:md5:ec074f3fcfec1726183ec67821ef7b16</guid>
    <pubDate>Sat, 04 Apr 2009 16:48:00 +0200</pubDate>
    <dc:creator>IrmatDen</dc:creator>
            
    <description>&lt;p&gt;Ce tutoriel en 2 parties vous guide pas à pas depuis l'initialisation d'une fenêtre jusqu'au déplacement d'un objet, tout en ajoutant la possibilité d'annuler des actions.&lt;br /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Qt4, Ogre 1.6 (première partie également testée avec la 1.4) &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;br /&gt;&lt;/p&gt;    &lt;p&gt;Ce tutoriel est disponible sous la forme de 2 fichiers PDF&amp;nbsp;; les codes sont téléchargeables directement depuis le pdf et sont hébergés chez developpez.com.&lt;/p&gt;


&lt;p&gt;N'hésitez pas à &lt;a href=&quot;http://forum.qtfr.org/viewtopic.php?pid=54142&quot;&gt;venir en parler sur le fil dédié&lt;/a&gt;&amp;nbsp;!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.qtfr.org/public/2009/integration-ogre-qt.pdf&quot;&gt;Intégrer Ogre à Qt&lt;/a&gt;&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I  -  Introduction&lt;br /&gt;
I-1  - Pourquoi  intégrer Ogre à Qt?&lt;br /&gt;
I-2  - Pré-requis&lt;br /&gt;
II  -  Initialiser  le système&lt;br /&gt;
II-1 - Objectif: écran noir (mais grâce à Ogre!)&lt;br /&gt;
II-2 - Première interaction: modification de la couleur de fond&lt;br /&gt;
III - Affichage d'un objet et gestion de  la caméra&lt;br /&gt;
III-1  - Ajouter de  la  lumière et un objet&lt;br /&gt;
III-2 - Gérer la caméra (gestion des événements et utilisation d'un dockwidget)&lt;br /&gt;
III-2-a - Contrôle du positionnement de la caméra par des spinbox&lt;br /&gt;
III-2-b - Contrôle du positionnement de la caméra par le clavier&lt;br /&gt;
III-2-c - Contrôle du positionnement de la caméra par la souris&lt;br /&gt;
IV  - Sélection d'entité&lt;br /&gt;
V  - Conclusion&lt;br /&gt;
VI  - Remerciements&lt;br /&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.qtfr.org/public/2009/integration-ogre-qt-part-2.pdf&quot;&gt;Intégrer Ogre à Qt - Partie 2&lt;/a&gt;&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I  - Une autre gestion des événements&lt;br /&gt;
I-1 - Inconvénients de l'approche précédente et motif pour changer&lt;br /&gt;
I-2  -  Implémentation&lt;br /&gt;
I-2-1 - Définition de l'interface nécessaire et modification au code actuel&lt;br /&gt;
I-2-2 - Implémentation du déplacement de la caméra&lt;br /&gt;
I-2-3 - Implémentation du déplacement de l'objet sélectionné&lt;br /&gt;
II  - Support de  l'annulation&lt;br /&gt;
II-1 - Présentation du  framework Undo  fourni par Qt&lt;br /&gt;
II-2  -  Implémentation&lt;br /&gt;
II-2-1  - Préparatif&lt;br /&gt;
II-2-2 - Annulation du changement de couleur de fond&lt;br /&gt;
II-2-3 - Annulation du déplacement d'un objet&lt;br /&gt;
III  - Conclusion&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Le tutoriel de Qt 4.5 est maintenant disponible en français</title>
    <link>http://doc.qtfr.org/post/2009/02/13/Le-tutoriel-de-Qt-45-est-maintenant-disponible-en-francais</link>
    <guid isPermaLink="false">urn:md5:f35a4448fe4380557e846e42a4f8e8e5</guid>
    <pubDate>Fri, 13 Feb 2009 15:37:00 +0100</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Tutoriels</category>
            
    <description>    &lt;p&gt;-d'après &lt;a href=&quot;http://labs.trolltech.com/blogs/2009/02/11/a-french-tutorial-for-mignon-45/#comments&quot; hreflang=&quot;fr&quot;&gt;A French tutorial for “Mignon 4.5″&lt;/a&gt;-&lt;/p&gt;


&lt;p&gt;Après le site de Qt Software (qui est partiellement traduit, les pages importantes on va dire), voilà maintenant le &lt;strong&gt;tutorial de Qt&lt;/strong&gt; qui est traduit dans la langue de Molière. Pour ceux que ça intéresse, vous le retrouverez sur &lt;a href=&quot;http://doc.trolltech.com/4.5/tutorials-addressbook-fr.html&quot; hreflang=&quot;en&quot;&gt;cette page&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Merci à tous ceux impliqués dans cette traduction, ça va aider certains qui ne s'y retrouvaient pas avec la langue de Shakespeare, et nous permettre de donner un lien dans le forum pour les débutants.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Utiliser la version de développement de WebKit avec Qt 4.4</title>
    <link>http://doc.qtfr.org/post/2008/06/05/QtWebKit-from-trunk</link>
    <guid isPermaLink="false">urn:md5:835be01307feeb179fee70c8148d4f44</guid>
    <pubDate>Thu, 05 Jun 2008 16:46:00 +0200</pubDate>
    <dc:creator>Red Rabbit</dc:creator>
        <category>Tutoriels</category>
        <category>WebKit</category>    
    <description>&lt;p&gt;Une astuce pour utiliser la branche principale de développement du projet WebKit au lieu de la version livrée avec Qt.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Qt4/version de développement de WebKit &lt;br /&gt;
&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://forum.qtfr.org/profile.php?id=1093&quot;&gt;Red Rabbit&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;Vous aurez besoin de la version 4.4.x de Qt pour suivre ce tutoriel&lt;/em&gt;&lt;/p&gt;


&lt;h3&gt;Introduction&lt;/h3&gt;

&lt;p&gt;Dans sa &lt;a href=&quot;http://doc.trolltech.com/4.4/&quot; hreflang=&quot;en&quot;&gt;dernière version&lt;/a&gt;, Qt s'est vu monté d'un nouveau module: &lt;a href=&quot;http://doc.trolltech.com/latest/qtwebkit.html&quot; hreflang=&quot;en&quot;&gt;QtWebKit&lt;/a&gt;, un moteur de rendu HTML concurrençant  &lt;a href=&quot;http://developer.mozilla.org/fr/docs/Gecko&quot; hreflang=&quot;fr&quot;&gt;Gecko&lt;/a&gt; (Firefox), &lt;a href=&quot;http://www.opera.com/&quot; hreflang=&quot;en&quot;&gt;Presto&lt;/a&gt; (Opera) et &lt;a href=&quot;http://www.microsoft.com/france/windows/products/winfamily/ie/default.mspx&quot; hreflang=&quot;en&quot;&gt;Trident&lt;/a&gt; (IE).&lt;br /&gt;
Le &lt;a href=&quot;http://www.webkit.org/&quot; hreflang=&quot;en&quot;&gt;projet WebKit&lt;/a&gt; étant en constant développement, il est dommage de devoir en utiliser une version obsolète avec Qt.&lt;/p&gt;


&lt;p&gt;Heureusement pour nous, le portage de Webkit vers les interfaces graphiques Qt et Gtk+ est développé dans la branche principale.
Ce qui signifie que QtWebKit est en évolution continue.&lt;br /&gt;
Donc pourquoi laisser passer une telle opportunité&amp;nbsp;?&lt;/p&gt;



&lt;h3&gt;Télécharger les sources de WebKit&lt;/h3&gt;

&lt;p&gt;Nous allons donc télécharger les sources à l'aide d'un système de gestion de versions.&lt;/p&gt;


&lt;p&gt;Avec Subversion:&lt;br /&gt;
&lt;code&gt;$ svn co http://svn.webkit.org/repository/webkit/trunk WebKit&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;Avec Git:&lt;br /&gt;
&lt;code&gt;$ git clone git://code.staikos.net/webkit&lt;/code&gt;&lt;/p&gt;



&lt;h3&gt;Compiler les sources&lt;/h3&gt;

&lt;p&gt;Comme un bon lien vaut mieux qu'un long discours, je vous prie de suivre les étapes se trouvant sur &lt;a href=&quot;http://trac.webkit.org/wiki/QtWebKit&quot; hreflang=&quot;en&quot;&gt;la documentation officielle&lt;/a&gt;.&lt;/p&gt;



&lt;h3&gt;Configurer mon projet&lt;/h3&gt;

&lt;p&gt;La compilation maintenant terminée, il faut indiquer à Qt d'utiliser notre nouvelle version de QtWebKit plutôt que celle livrée par défaut.&lt;/p&gt;


&lt;p&gt;Téléchargez le fichier &lt;a href=&quot;http://doc.qtfr.org/public/2008/webkittrunk.pri&quot;&gt;webkittrunk.pri&lt;/a&gt; et placez le à cotez de votre fichier &lt;code&gt;.pro&lt;/code&gt;.&lt;br /&gt;
C'est le contenu de ce fichier qui permet à Qt d'utiliser une version de QtWebKit autre que la sienne (pensez à changer le chemin &lt;code&gt;WEBKITHOME&lt;/code&gt; dans le fichier &lt;code&gt;webkittrunk.pri&lt;/code&gt;).&lt;/p&gt;


&lt;p&gt;Pour que Qt prenne en compte les changements lors de la compilation du projet, ajoutez la ligne suivante à votre fichier &lt;code&gt;.pro&lt;/code&gt;:&lt;br /&gt;
&lt;code&gt;include( webkittrunk.pri )&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;Pour finir, il faut définir la variable globale &lt;code&gt;QT_WEBKIT=webkit_trunk&lt;/code&gt; pour indiquer à Qt d'utiliser notre version de QtWebKit et voilà le tour est joué.&lt;/p&gt;


&lt;p&gt;&lt;ins&gt;Votre projet utilise désormais la version actuelle de WebKit, elle est pas belle la vie !?&lt;/ins&gt;&lt;/p&gt;</description>
    
          <enclosure url="http://doc.qtfr.org/public/2008/webkittrunk.pri"
      length="601" type="text/plain" />
    
    
      </item>
    
  <item>
    <title>Interaction entre boost.signals et les signaux/slots Qt</title>
    <link>http://doc.qtfr.org/post/2008/05/21/Interaction-entre-boostsignals-et-les-signaux/slots-Qt</link>
    <guid isPermaLink="false">urn:md5:36453448a7fa62278b910f115736ec3e</guid>
    <pubDate>Wed, 21 May 2008 20:46:00 +0200</pubDate>
    <dc:creator>IrmatDen</dc:creator>
        <category>Tutoriels</category>
        <category>Boost</category><category>signaux-slots</category><category>version_Qt4</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Comment faire cohabiter les signaux/slots de Qt avec la librairie boost.signals&amp;nbsp;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce tutoriel est destiné à vous guider pour mettre en place une interaction entre boost.signals et le mécanisme de signaux/slots Qt.&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;br /&gt;
&lt;strong&gt;Fil de discussion&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://forum.qtfr.org/viewtopic.php?pid=41721&quot;&gt;Forum&lt;/a&gt;&lt;/p&gt;    &lt;h3&gt;Pré requis:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;La connaissance du &lt;a href=&quot;http://doc.trolltech.com/4.4/signalsandslots.html&quot;&gt;fonctionnement des signaux/slots&lt;/a&gt; avec Qt&lt;/li&gt;
&lt;li&gt;Une connaissance basique de &lt;a href=&quot;http://www.boost.org/doc/libs/1_35_0/doc/html/signals.html&quot;&gt;boost.signals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Une connaissance basique de &lt;a href=&quot;http://www.boost.org/doc/libs/1_35_0/libs/functional/index.html&quot;&gt;boost.functional&lt;/a&gt; (tout particulièrement les fonctions de binding)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Introduction&lt;/h3&gt;


&lt;p&gt;Il est intéressant de savoir faire ceci dans la mesure où vous désireriez utiliser des classes écrites en C++ pur avec les mécanismes Qt. Par exemple, une couche métier utilisant le mécanisme de boost.signals comme implémentation du pattern observateur, que vous désirez connecter à la couche IHM écrite à l'aide de Qt.&lt;br /&gt;
Toutefois, cet article n'est ni une introduction à Qt, ni à boost.signals.&lt;/p&gt;


&lt;h3&gt;Précautions et conflits&lt;/h3&gt;


&lt;p&gt;Premièrement, il y a un conflit entre boost et Qt au niveau du terme &quot;signals&quot;. En effet, Qt déclare celui-ci comme #define signals protected, tandis qu'il s'agit d'un type boost. Il y a plusieurs façons de résoudre ce conflit:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Inclure les en-têtes boost en premier&lt;/li&gt;
&lt;li&gt;Placer boost.signals dans son propre namespace (pour plus d'infos se référer à &lt;a href=&quot;http://www.boost.org/doc/libs/1_34_1/doc/html/signals/s04.html#id1633734&quot;&gt;la Q/R 3 de la FAQ boost.signals&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Depuis Qt 4.1, Trolltech à ajouté le paramètre no_keywords à la liste des valeurs potentielles pour CONFIG. Ajouter CONFIG += no_keywords dans votre fichier pro vous permettra donc d'utiliser sans soucis boost.signal. Le bémol de cette solution est que les &quot;mots clés&quot; suivant disparaissent au profit des macros suivantes:&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;signals -&amp;gt; Q_SIGNALS&lt;/li&gt;
&lt;li&gt;slots -&amp;gt; Q_SLOTS&lt;/li&gt;
&lt;li&gt;emit -&amp;gt; Q_EMIT&lt;/li&gt;
&lt;li&gt;foreach -&amp;gt; Q_FOREACH&lt;/li&gt;
&lt;li&gt;forever -&amp;gt; Q_FOREVER&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les slots de Qt sont des méthodes standard, qui ont en plus la possibilité de connaître son émetteur (à la condition sine qua non que son appel soit lié à l'émission d'un signal). L'usage de cette fonction est grandement déconseillé en temps normal (&lt;a href=&quot;http://doc.trolltech.com/4.4/qsignalmapper.html&quot;&gt;QSignalMapper&lt;/a&gt; devrait amplement suffir pour s'en passer). Mais dans certains rares cas, vous pouvez avoir absolument besoin de cette info&amp;nbsp;: dans ce cas pensez bien à vérifier que le &lt;code&gt;QObject*&lt;/code&gt; retourné n'est pas null. Dans ce dernier cas, c'est que le slot a été invoqué de façon normale (c'est ce que l'on fait en connectant un slot Qt à un signal boost).&lt;/p&gt;



&lt;h3&gt;Interaction boost.signals et signaux/slots Qt&lt;/h3&gt;


&lt;p&gt;Je vais maintenant aborder 3 interactions possibles entre ces 2 bibliothèques:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Utilisation d'un boost.signal connecté à un slot Qt&lt;/li&gt;
&lt;li&gt;Utilisation d'un boost.signal connecté à un signal Qt&lt;/li&gt;
&lt;li&gt;Utilisation d'un signal Qt connecté à une (ou des) fonction(s) C++ standard par le biais de boost.signals&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vous trouverez un code d'exemple reprenant ces 3 aspect en pièce jointe de ce document. Dans ce code, n'oubliez pas de régler les valeurs de &lt;code&gt;LIBS&lt;/code&gt; et &lt;code&gt;INCLUDEPATH&lt;/code&gt; de manière à correspondre à votre configuration.&lt;/p&gt;


&lt;h4&gt;Utilisation d'un boost.signal connecté à un slot Qt&lt;/h4&gt;


&lt;p&gt;Un slot au sens Qt est en réalité une fonction standard. Par conséquent, il est trivial d'en connecter un à un signal boost.&lt;br /&gt;
La seule chose différente entre un slot et une méthode de classe standard est la possibilité de récupérer des infos sur l'objet appelant (par le biais de &lt;a href=&quot;http://doc.trolltech.com/4.3/qobject.html#sender&quot;&gt;QObject::sender()&lt;/a&gt;). Je tiens à souligner à nouveau le &quot;danger&quot; posé par cette méthode: si le slot n'est pas appelé par un signal, le &lt;code&gt;QObject*&lt;/code&gt; renvoyé sera null. Par conséquent, réduisez au minimum son utilisation, et vérifiez toujours la validité de l'objet renvoyé!&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; QtClass : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QObject
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
Q_OBJECT
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; slots:
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; qtSlot&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;
        QObject *s = sender&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;s == &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
            std::&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;From internal connection:&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; std::&lt;span style=&quot;color: #00eeff;&quot;&gt;endl&lt;/span&gt;;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&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;!s&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
            std::&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;Unknown sender:&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; std::&lt;span style=&quot;color: #00eeff;&quot;&gt;endl&lt;/span&gt;;
        std::&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;In QtClass::qtSlot(), x=&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; std::&lt;span style=&quot;color: #00eeff;&quot;&gt;endl&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;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NonQtClass
&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;void&lt;/span&gt; boostSignalToQtSlot&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QtClass *qc&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;
        boost::&lt;span style=&quot;color: #00eeff;&quot;&gt;signal&lt;/span&gt;&amp;lt;void &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;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;gt; sig;
        sig.&lt;span style=&quot;color: #00eeff;&quot;&gt;connect&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;boost::&lt;span style=&quot;color: #00eeff;&quot;&gt;bind&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;amp;QtClass::&lt;span style=&quot;color: #00eeff;&quot;&gt;qtSlot&lt;/span&gt;, qc, _1&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;;
        sig&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;3&lt;/span&gt;.14f&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;; 
&amp;nbsp;
&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;
    NonQtClass nqc;
    QtClass    qc;
&amp;nbsp;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;// Déclenche un boost::signal attaché à un slot Qt:&lt;/span&gt;
    nqc.&lt;span style=&quot;color: #00eeff;&quot;&gt;boostSignalToQtSlot&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;amp;qc&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &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;p&gt;Sortie obtenue:&lt;/p&gt;
&lt;pre&gt;
Unknown sender:
In QtClass::qtSlot(), x=3.14
&lt;/pre&gt;



&lt;h4&gt;Utilisation d'un boost.signal connecté à un signal Qt&lt;/h4&gt;


&lt;p&gt;Un signal au sens Qt n'est qu'une méthode standard, le mot clé &lt;code&gt;signals&lt;/code&gt; étant redéfini par Qt comme &lt;code&gt;protected&lt;/code&gt;. Il est donc nécessaire de fournir une méthode permettant de déclencher ce signal avec le(s) paramètre(s) voulu(s). Il y a 2 approches possible; la première consiste à ajouter une méthode à votre classe Qt, la seconde à utiliser une classe de pont.&lt;br /&gt;
Bien que plus verbeuse, la seconde méthode permet de découpler réellement la couche utilisant Qt de la couche sans Qt en &quot;intercalant&quot; une couche servant d'aptateur. Ici, ce sera la première méthode qui sera illustrée; la seconde le sera dans le 3ème et dernier point.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; QtClass : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QObject
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
Q_OBJECT
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:
    QtClass&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;
        connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;qtSignal&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;&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: #0000dd;&quot;&gt;this&lt;/span&gt;, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;qtSlot&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;&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;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;// OBLIGATOIRE si on veut connecter un signal boost à un signal Qt: les signaux sont **protégés**&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; triggerQtSignalEmission&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;
        emit qtSignal&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;;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; slots:
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; qtSlot&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;
        QObject *s = sender&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;s == &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
            std::&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;From internal connection:&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; std::&lt;span style=&quot;color: #00eeff;&quot;&gt;endl&lt;/span&gt;;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&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;!s&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
            std::&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;Unknown sender:&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; std::&lt;span style=&quot;color: #00eeff;&quot;&gt;endl&lt;/span&gt;;
        std::&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;In QtClass::qtSlot(), x=&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; std::&lt;span style=&quot;color: #00eeff;&quot;&gt;endl&lt;/span&gt;;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
signals:
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; qtSignal&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;&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;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NonQtClass
&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;void&lt;/span&gt; boostSignalToQtSignal&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QtClass *qc&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;
        boost::&lt;span style=&quot;color: #00eeff;&quot;&gt;signal&lt;/span&gt;&amp;lt;void &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;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;gt; sig;
        sig.&lt;span style=&quot;color: #00eeff;&quot;&gt;connect&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;boost::&lt;span style=&quot;color: #00eeff;&quot;&gt;bind&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;amp;QtClass::&lt;span style=&quot;color: #00eeff;&quot;&gt;triggerQtSignalEmission&lt;/span&gt;, qc, _1&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;;
        sig&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;42&lt;/span&gt;.0f&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;;
&amp;nbsp;
&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;
    NonQtClass nqc;
    QtClass    qc;
&amp;nbsp;
    &lt;span style=&quot;color: #ff0000; font-style: italic;&quot;&gt;/* Déclenche un boost::signal lié à l'émission d'un signal Qt
       (on triche par l'utilisation d'une méthode intermédiaire obligatoire) */&lt;/span&gt;
    nqc.&lt;span style=&quot;color: #00eeff;&quot;&gt;boostSignalToQtSignal&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;amp;qc&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &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;p&gt;Sortie obtenue:&lt;/p&gt;
&lt;pre&gt;
From internal connection:
In QtClass::qtSlot(), x=42
&lt;/pre&gt;



&lt;h4&gt;Utilisation d'un signal Qt connecté à une (ou des) fonction(s) C++ standard par le biais de boost.signals&lt;/h4&gt;


&lt;p&gt;Ici, ça se complique un peu (vraiment un peu, ne vous inquiètez pas ). En effet, nous savons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;qu'un signal Qt est une méthode protégée&lt;/li&gt;
&lt;li&gt;que le corps d'un signal Qt va associer les informations sur l'objet émetteur (dans le but de permettre l'utilisation de la méthode sender() dans le slot)&lt;/li&gt;
&lt;li&gt;que nous ne pouvons pas connecter de fonctions standard à un signal Qt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;
Nous allons donc mettre en place ici une méthode impliquant la création d'une classe servant d'adaptateur entre les 2 paradigmes (signaux Qt / boost.signals).&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; QtClass : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QObject
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
Q_OBJECT
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:
    &lt;span style=&quot;color: #ff0000;&quot;&gt;// OBLIGATOIRE si on veut connecter un signal boost à un signal Qt: les signaux sont **protégés**&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; triggerQtSignalEmission&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;
        emit qtSignal&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;;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
signals:
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; qtSignal&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;&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;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; QtSignalToStandardCPPBridge : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QObject
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
Q_OBJECT
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:
    QtSignalToStandardCPPBridge&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QtClass *qc&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;
        connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;qc, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;qtSignal&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;&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: #0000dd;&quot;&gt;this&lt;/span&gt;, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;onQtSignalEmitted&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;&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;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    template&amp;lt;typename Signature&amp;gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; addStandardSlot&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;Signature fun&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;
        sig.&lt;span style=&quot;color: #00eeff;&quot;&gt;connect&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;fun&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;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; slots:
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; onQtSignalEmitted&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;
        sig&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;;
    &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;:
    boost::&lt;span style=&quot;color: #00eeff;&quot;&gt;signal&lt;/span&gt;&amp;lt;void &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;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&amp;gt;sig;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; NonQtClass
&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: #ff0000;&quot;&gt;// fonction normale que l'on appelera depuis un signal Qt en passant par un pont&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; normalFunction&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;
        std::&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;In NonQtClass::normalFunction(), x=&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; x &amp;lt;&amp;lt; std::&lt;span style=&quot;color: #00eeff;&quot;&gt;endl&lt;/span&gt;;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;// Et une autre pour le fun&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; displaySquareRoot&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;
        std::&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;In NonQtClass::displaySquareRoot(), sqrt(x)=&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; std::&lt;span style=&quot;color: #0000dd;&quot;&gt;sqrt&lt;/span&gt;&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; &amp;lt;&amp;lt; std::&lt;span style=&quot;color: #00eeff;&quot;&gt;endl&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;public&lt;/span&gt;:
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; QtSignalToStandardFunction&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QtClass *qc&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;
        QtSignalToStandardCPPBridge adapter&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;qc&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        adapter.&lt;span style=&quot;color: #00eeff;&quot;&gt;addStandardSlot&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;boost::&lt;span style=&quot;color: #00eeff;&quot;&gt;bind&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;amp;NonQtClass::&lt;span style=&quot;color: #00eeff;&quot;&gt;normalFunction&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;, _1&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;;
        adapter.&lt;span style=&quot;color: #00eeff;&quot;&gt;addStandardSlot&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;boost::&lt;span style=&quot;color: #00eeff;&quot;&gt;bind&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;amp;NonQtClass::&lt;span style=&quot;color: #00eeff;&quot;&gt;displaySquareRoot&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;, _1&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: #ff0000;&quot;&gt;// On déclenche ici manuellement l'émission du signal Qt&lt;/span&gt;
        qc-&amp;gt;triggerQtSignalEmission&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;121&lt;/span&gt;.0f&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;;
&amp;nbsp;
&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;
    NonQtClass nqc;
    QtClass    qc;
&amp;nbsp;
    nqc.&lt;span style=&quot;color: #00eeff;&quot;&gt;QtSignalToStandardFunction&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;amp;qc&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &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;p&gt;Sortie obtenue:&lt;/p&gt;
&lt;pre&gt;
In NonQtClass::normalFunction(), x=121
In NonQtClass::displaySquareRoot(), sqrt(x)=11
&lt;/pre&gt;</description>
    
          <enclosure url="http://doc.qtfr.org/public/2008/qt_boost-signals.zip"
      length="1491" type="application/zip" />
    
    
      </item>
    
  <item>
    <title>Utilisation de PyQt avec Qt 4.4</title>
    <link>http://doc.qtfr.org/post/2008/05/01/Utilisation-de-PyQt-avec-Qt-44</link>
    <guid isPermaLink="false">urn:md5:0e18e4ab0dd062e5d371fd6f4a996b52</guid>
    <pubDate>Thu, 01 May 2008 15:14:00 +0200</pubDate>
    <dc:creator>Visiteur</dc:creator>
        <category>Documentation</category>
        <category>installation</category><category>Linux</category><category>version_PyQt4</category><category>version_Qt4</category>    
    <description>&lt;p&gt;Tool69 vous propose, étape par étape, d'utiliser PyQt avec Qt4.4 RC1.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Qt4/PyQt4 &lt;br /&gt;
&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://forum.qtfr.org/profile.php?id=428&quot;&gt;Tool69&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Le document est disponible en 2 formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Voir la &lt;a href=&quot;http://kib2.free.fr/Articles/Installation_d%C3%A9taill%C3%A9e_de_PyQt4.4.html&quot;&gt;page sur le blog de l'auteur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;libre téléchargement en PDF&amp;nbsp;: &lt;a href=&quot;http://doc.qtfr.org/public/2008/Install_Qt44.pdf&quot;&gt;téléchargez&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description>
    
          <enclosure url="http://doc.qtfr.org/public/2008/Install_Qt44.pdf"
      length="63431" type="application/pdf" />
    
    
      </item>
    
  <item>
    <title>Intégration de Qt 4 Open Source avec Apple Xcode 3.0 et 3.1</title>
    <link>http://doc.qtfr.org/post/2008/03/12/Integration-de-Qt-4-Open-Source-avec-Apple-Xcode-30-et-31</link>
    <guid isPermaLink="false">urn:md5:ef28bfc64d1136381f3943ff138ad3d9</guid>
    <pubDate>Wed, 12 Mar 2008 10:03:00 +0100</pubDate>
    <dc:creator>chsxf</dc:creator>
        <category>Tutoriels</category>
        <category>apple</category><category>integration</category><category>xcode</category>    
    <description>&lt;p&gt;Qt est un toolkit fabuleux disposant de kits d'intégration pour divers IDE dans sa version commerciale mais quasiment aucun pour sa version Open Source.
Ce tutoriel cherche à vous faciliter l'intégration de Qt avec Apple Xcode pour Mac OS X.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Qt4 / Xcode 3.0 ou 3.1 &lt;br /&gt;
&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: Christophe (&lt;a href=&quot;http://forum.qtfr.org/profile.php?id=1125&quot;&gt;chsxf&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;Ce tutoriel requiert l’installation de Qt 4 pour Mac OS X bien que cette étape sorte du cadre de cet exposé.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;Les fichiers projets Qt&lt;/h2&gt;


&lt;p&gt;Afin de conserver une portabilité maximale au travers de systèmes aussi hétéroclites que Windows, Mac OS X ou Linux, Qt propose un ensemble d’outils de gestion des projets. La base de cet ensemble est représentée par un fichier se terminant par l’extension .pro (pour projet) et l’utilitaire qmake. Le principe est simple&amp;nbsp;: la configuration du projet s’effectue au sein du fichier .pro et l’utilitaire qmake se charge de générer les scripts de compilation adéquats en fonction de la plate-forme (notamment la création des fameux Makefile).&lt;/p&gt;


&lt;p&gt;Ce principe de fonctionnement est très spécifique à Qt et des environnements de développements intégrés (IDE) comme Xcode ne sont pas conçus pour le supporter dès leur mise en route. Il existe toutefois des solutions pour contourner une partie des écueils que l’on peut rencontrer dans ce cas précis en acceptant de faire une croix sur certaines facilités.&lt;/p&gt;


&lt;h2&gt;Projet Xcode ou projet Makefile&amp;nbsp;?&lt;/h2&gt;


&lt;p&gt;Deux approches sont à considérer en débutant un développement Qt sous Xcode. Faut-il choisir de travailler uniquement à partir des projets natifs Xcode (fichiers .xcodeproj) ou d’envisager un projet à base d’un fichier .pro et de Makefiles&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Autant vous le dire immédiatement, la première solution n’offre que peu d’avantages puisque créer un fichier de projet Xcode pour gérer la totalité de votre développement ne permet pas de prendre en charge l’actualisation du contenu de votre fichier .pro lors de l’ajout de classes ou de boîtes de dialogues. Les fichiers .pro constituant la base d’un projet Qt, il vous serait alors impossible de transposer de façon immédiate vos fichiers sources depuis votre Mac vers n’importe quel autre système ou, plus ennuyeux, environnement de développement. C’est pourquoi nous choisirons la deuxième approche.&lt;/p&gt;


&lt;h2&gt;Configurer un projet Makefile&lt;/h2&gt;


&lt;p&gt;Ce que nous appelons un «&amp;nbsp;projet Makefile&amp;nbsp;» est tout simplement une méthode détournée qui permet de configurer Xcode (ou n’importe quel autre IDE qui l’autorise) pour qu’il utilise un système de configuration à base de fichiers Makefile. L’intérêt dans le cas de Qt est que les fichiers .pro et qmake fonctionnent à merveille avec cette solution, de façon portable.&lt;/p&gt;


&lt;p&gt;Nous ensivagerons les étapes de façon différente pour Xcode 3.0 ou Xcode 3.1 (en version béta à l’heure ou nous écrivons ces lignes) le cas échéant.&lt;/p&gt;


&lt;h3&gt;Pour commencer&lt;/h3&gt;


&lt;p&gt;La première étape consiste à créer un projet adapté&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Xcode 3.0&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créez un nouveau projet par le menu &lt;strong&gt;File&lt;/strong&gt; &amp;gt; &lt;strong&gt;New project…&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Sélectionnez le type &lt;strong&gt;External Build System&lt;/strong&gt; (Système de Compilation Externe)&lt;/li&gt;
&lt;li&gt;Après avoir sélectionné l’emplacement du projet, Xcode vous fournit un projet vide prêt pour compiler un fichier Makefile.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Xcode 3.1 (avant la beta 3 du SDK iPhone)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créez un nouveau projet par le menu &lt;strong&gt;File&lt;/strong&gt; &amp;gt; &lt;strong&gt;New project…&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Sélectionnez le type de projet que vous souhaitez et nommez-le.&lt;/li&gt;
&lt;li&gt;Dans la fenêtre de projet, supprimez toutes les entrées et les dossiers appartenant au projet.&lt;/li&gt;
&lt;li&gt;Dans la section &lt;strong&gt;Targets&lt;/strong&gt;, supprimez la cible par défaut.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Xcode 3.1 (après la beta 3 du SDK iPhone)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créez un nouveau projet par le menu &lt;strong&gt;File&lt;/strong&gt; &amp;gt; &lt;strong&gt;New project…&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Sélectionnez le type &lt;strong&gt;External Build System&lt;/strong&gt; (Système de Compilation Externe) dans la section &lt;strong&gt;Others&lt;/strong&gt; (Autres)&lt;/li&gt;
&lt;li&gt;Après avoir sélectionné l’emplacement du projet, Xcode vous fournit un projet vide prêt pour compiler un fichier Makefile.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Préparer l'exécution de qmake&lt;/h3&gt;


&lt;p&gt;La deuxième étape consiste à préparer les cibles pour exécuter qmake puis compiler les Makefiles générés&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Xcode 3.0&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avec cette version d’Xcode, vous disposez déjà d’une cible permettant l’appel de make et la compilation des Makefiles. Il ne vous reste plus qu’à ajouter la cible propre à qmake.&lt;/li&gt;
&lt;li&gt;Rendez-vous dans le menu &lt;strong&gt;Project&lt;/strong&gt; &amp;gt; &lt;strong&gt;New target…&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Sélectionnez le type &lt;strong&gt;External Target&lt;/strong&gt; (Cible externe).&lt;/li&gt;
&lt;li&gt;Nommez la cible &lt;strong&gt;qmake&lt;/strong&gt; et terminez. La cible doit apparaître dans la section &lt;strong&gt;Targets&lt;/strong&gt; de votre projet.&lt;/li&gt;
&lt;li&gt;Double-cliquez cette nouvelle cible pour faire apparaître ses propriétés.&lt;/li&gt;
&lt;li&gt;Dans le champ &lt;strong&gt;Build Tool&lt;/strong&gt;, entrez &lt;strong&gt;/usr/bin/qmake&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Dans le champ &lt;strong&gt;Arguments&lt;/strong&gt;, supprimez le texte existant et entrez &lt;strong&gt;–spec macx-g++&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Fermez la fenêtre.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Xcode 3.1&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rendez-vous dans le menu &lt;strong&gt;Project&lt;/strong&gt; &amp;gt; &lt;strong&gt;New target…&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Sélectionnez le type &lt;strong&gt;External Target&lt;/strong&gt; (Cible externe) dans la section &lt;strong&gt;Others&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Nommez la cible &lt;strong&gt;make&lt;/strong&gt; et terminez. La cible doit apparaître dans la section &lt;strong&gt;Targets&lt;/strong&gt; de votre projet.&lt;/li&gt;
&lt;li&gt;Une deuxième fois, rendez-vous dans le menu &lt;strong&gt;Project&lt;/strong&gt; &amp;gt; &lt;strong&gt;New target…&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Sélectionnez le type &lt;strong&gt;External Target&lt;/strong&gt; (Cible externe).&lt;/li&gt;
&lt;li&gt;Nommez la cible &lt;strong&gt;qmake&lt;/strong&gt; et terminez. La cible doit apparaître dans la section &lt;strong&gt;Targets&lt;/strong&gt; de votre projet.&lt;/li&gt;
&lt;li&gt;Double-cliquez cette nouvelle cible pour faire apparaître ses propriétés.&lt;/li&gt;
&lt;li&gt;Dans le champ &lt;strong&gt;Build Tool&lt;/strong&gt;, entrez &lt;strong&gt;/usr/bin/qmake&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Dans le champ &lt;strong&gt;Arguments&lt;/strong&gt;, supprimez le texte existant et entrez &lt;strong&gt;–spec macx-g++&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Fermez la fenêtre.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Terminé&amp;nbsp;!&lt;/h3&gt;


&lt;p&gt;Il ne nous reste plus qu’à déterminer les dépendances entre les cibles. Sélectionnez la cible qmake et glissez-la sur l’autre cible de votre projet pour que cette dernière en devienne dépendante. Si la dépendance a été validée, la cible qmake devrait apparaître comme un enfant de la première cible (cliquez éventuellement sur la flèche correspondante pour déplier la branche relative à la cible). Les dépendances ont une signification simple. Toute cible qui dépend d’une autre exécutera la cible dont elle dépend avec elle-même. Dans le cas présent, nous demandons à ce que la cible active exécute la cible qmake pour générer les fichiers Makefiles à partir des données du projet avant de vouloir lancer la compilation avec make.&lt;/p&gt;


&lt;h2&gt;Fichiers .pro et début du développement&lt;/h2&gt;


&lt;p&gt;La dernière étape consiste à insérer dans le projet Xcode les éléments de votre projet Qt. &lt;em&gt;Nous supposons que vos fichiers Qt se trouvent dans le même répertoire que le fichier .xcodeproj.&lt;/em&gt; Il vous suffit alors de les ajouter au projet Xcode. Pour ce faire, utilisez le menu &lt;strong&gt;Project&lt;/strong&gt; &amp;gt; &lt;strong&gt;Add to Project…&lt;/strong&gt; et sélectionnez votre fichier .pro, vos fichiers sources et éventuellement les autres fichiers susceptibles d’en faire partie (ressources, fichiers QtDesigner, etc…).&lt;/p&gt;


&lt;h2&gt;Compilation&lt;/h2&gt;


&lt;p&gt;A ce stade, votre projet devrait être prêt à compiler. C’est l’heure de vérité. Tentez le menu &lt;strong&gt;Build&lt;/strong&gt; &amp;gt; &lt;strong&gt;Build&lt;/strong&gt; et contrôler le résultat dans la barre d’état d’Xcode ou dans la fenêtre &lt;strong&gt;Build&lt;/strong&gt; &amp;gt; &lt;strong&gt;Build Results&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;Lancement de l’exécutable&lt;/h2&gt;


&lt;p&gt;Il est temps maintenant d’exécuter votre logiciel. Utilisant un système de compilation externe, Xcode n’est pas en mesure de connaître de façon automatique l’emplacement de votre exécutable. Vous allez devoir l’ajouter au projet. Utilisez le menu &lt;strong&gt;Project&lt;/strong&gt; &amp;gt; &lt;strong&gt;New Custom Executable…&lt;/strong&gt; (Nouvel exécutable personnalisé) et sélectionnez le fichier de l’exécutable. Il devrait apparaître dans la section &lt;strong&gt;Executables&lt;/strong&gt; du projet. En tant qu’unique exécutable du projet, il devient également l’exécutable actif et sera exécuté par défaut à chaque fois que vous souhaiterez exécuter votre projet.&lt;/p&gt;


&lt;p&gt;Utilisez le menu &lt;strong&gt;Run&lt;/strong&gt; &amp;gt; &lt;strong&gt;Run&lt;/strong&gt; ou &lt;strong&gt;Run&lt;/strong&gt; &amp;gt; &lt;strong&gt;Go&lt;/strong&gt; pour le lancer.&lt;/p&gt;


&lt;h2&gt;Avantages et Défauts&lt;/h2&gt;


&lt;p&gt;Le terme &lt;em&gt;Défauts&lt;/em&gt; est au pluriel dans ce titre mais la méthode exposée précédemment n’en présente qu’un seul&amp;nbsp;: le fichier .pro n’est pas actualisé automatiquement en cas de nouveaux ajouts de fichiers à votre projet.&lt;/p&gt;


&lt;p&gt;Certes, il s’agit là d’un manque à combler dans l’intégration de Qt à Xcode mais en comparaison des nombreux avantages que présente notre méthode, cela n’est pas grand chose&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Respect du standard instauré par Qt pour la compilation des projets&lt;/li&gt;
&lt;li&gt;Portabilité du fichier .pro d’une plate-forme à une autre&lt;/li&gt;
&lt;li&gt;Aucune contrainte au moment du passage à un autre IDE qu’Xcode&lt;/li&gt;
&lt;li&gt;Possibilité de modifier le projet Qt en dehors d’Xcode sans avoir à reconfigurer Xcode&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;


&lt;p&gt;Comme toute chose, Xcode possède ses amateurs et ses détracteurs. En tant que produit Apple, il constitue un incontournable pour le développement d’applications natives Mac OS X. Bien que des environnements de développements portables spécifiques à Qt existent tels que &lt;a href=&quot;http://www.monkeystudio.org/&quot;&gt;MonkeyStudio&lt;/a&gt;, &lt;a href=&quot;http://www.edyuk.org/&quot;&gt;Edyuk&lt;/a&gt; ou encore &lt;a href=&quot;http://qdevelop.free.fr/&quot;&gt;QDevelop&lt;/a&gt;, les utilisateurs d’Xcode trouveront peut-être un intérêt à éviter la multiplication des outils et nous espérons que ce tutoriel les aura aidé à améliorer leur entrée dans le monde de Qt.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Introduction aux MVC et création d'un modèle hiérarchique simple</title>
    <link>http://doc.qtfr.org/post/2007/12/16/Creation-dun-modele-hierarchique-simple-base-sur-QAbstractItemModel</link>
    <guid isPermaLink="false">urn:md5:df641f7821f791d36e6b449eb2e1ffd8</guid>
    <pubDate>Sun, 16 Dec 2007 17:02:00 +0100</pubDate>
    <dc:creator>Guid</dc:creator>
        <category>Tutoriels</category>
        <category>class_QAbstractItemModel</category><category>class_QModelIndex</category><category>class_QTreeView</category><category>modèle-vue</category><category>version_Qt4</category>    
    <description>&lt;p&gt;Ce document présente le concept général de MVC, puis s'attarde sur celui de Qt 4 et enfin, une mise en oeuvre simple du &lt;code&gt;QAbstractItemModel&lt;/code&gt; est expliquée en détail et est basée sur sur l'exemple officiel Qt &quot;simpletreemodel&quot;.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Toutes versions à partir de Qt 4.0 (exemple fait avec C++/Qt 4.3.3)&lt;br /&gt;
&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: Guillaume -Guid- DENRY (sur le forum, &lt;a href=&quot;http://forum.qtfr.org/profile.php?id=396&quot;&gt;Azuriel&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;    &lt;h2&gt;Présentation&lt;/h2&gt;


&lt;p&gt;L'affichage et la manipulation de données est une problèmatique aussi vieille que l'informatique elle-même.
En 1979, une tentative de formalisation de ce domaine aboutit au concept de &lt;acronym title=&quot;Model-View-Controller&quot;&gt;MVC&lt;/acronym&gt; (littéralement Modèle-Vue-Controlleur) qui prend tout d'abord &lt;a href=&quot;http://st-www.cs.uiuc.edu/users/smarch/st-docs/mvc.html&quot; hreflang=&quot;en&quot;&gt;naissance dans le monde smalltalk&lt;/a&gt;, et qui permet de dissocier les données de la présentation ainsi que de la logique de contrôle.
Cette stratégie permet un découpage clair des concepts et de leurs implémentations, mais surtout une factorisation du code; le fameux concept
&lt;a href=&quot;http://en.wikipedia.org/wiki/DRY_code&quot; hreflang=&quot;en&quot;&gt;DRY&lt;/a&gt; cher à Ruby, ainsi, alors que le &lt;em&gt;modèle&lt;/em&gt; est entièrement dévoué à fournir des données et à en accepter, la &lt;em&gt;vue&lt;/em&gt; est uniquement concentrée sur la façon d'afficher les données (c'est la partie émergée de l'iceberg pour l'utilisateur de l'application) tandis que le &lt;em&gt;controlleur&lt;/em&gt;, tel un arbitre, se charge de synchroniser les évènements entre le &lt;em&gt;modèle&lt;/em&gt; et la &lt;em&gt;vue&lt;/em&gt;.&lt;/p&gt;


&lt;p&gt;Qt 4 a choisi d'utiliser ces concepts au sein de plusieurs de ses composants de manipulation et d'affichage de données. Dans la bibliothèque de Trolltech, le C du MVC se retrouve combiné au V pour des raisons de praticité et on parle ainsi de &lt;a href=&quot;http://doc.trolltech.com/4.3/model-view-programming.html&quot; hreflang=&quot;en&quot;&gt;''Modèle/Vue''&lt;/a&gt;.
A ces concepts se voit adjoint celui de &lt;em&gt;delegate&lt;/em&gt; qui définit concrètement la façon dont sont présentées et éditées les données (par exemple via une liste déroulante, une cellule d'édition, etc).&lt;/p&gt;


&lt;p&gt;On trouve plusieurs composants de type &quot;vue&quot;&amp;nbsp;; voici ceux que l'on peut trouver dans la dernière version de Qt 4 au moment où est écrit ce tutoriel (4.3.3)&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le &lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.3/qtableview.html&quot; hreflang=&quot;en&quot;&gt;QTableView&lt;/a&gt;&lt;/code&gt; qui permet d'afficher un ensemble de données sous forme de tableau et sans notion de hiérarchie.&lt;/li&gt;
&lt;li&gt;Le &lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.3/qtreeview.html&quot; hreflang=&quot;en&quot;&gt;QTreeView&lt;/a&gt;&lt;/code&gt; modélise un ensemble de données hiérarchisées sous forme d'arbre.&lt;/li&gt;
&lt;li&gt;Le &lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.3/qlistview.html&quot; hreflang=&quot;en&quot;&gt;QListView&lt;/a&gt;&lt;/code&gt; affiche des données sous forme de liste, exactement comme le mode &quot;liste&quot; d'un explorateur de fichiers.&lt;/li&gt;
&lt;li&gt;Le &lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.3/qcolumnview.html&quot; hreflang=&quot;en&quot;&gt;QColumnView&lt;/a&gt;&lt;/code&gt; qui affiche une succession de QListViews pour afficher une hiérarchie, à l'instar de Finder, le fameux navigateur de fichiers de MacOSX ou de celui de l'Ipod.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il est à noter que tous ces composants trouvent leurs équivalents déjà affectés de modèles simples et qui peuvent être amplement suffisants pour un usage de base. Si vous cherchez un moyen simple d'afficher des données sans vous soucier d'optimisation, de maintenabilité, de paramétrage fin et si concevoir un système MVC ne vous séduit pas plus que cela, ce tutoriel n'est peut-être pas tout-à-fait indiqué et vous devriez peut-être vous pencher sur les &lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.3/qtablewidget.html&quot; hreflang=&quot;en&quot;&gt;QTableWidget&lt;/a&gt;&lt;/code&gt;/&lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.3/qtreewidget.html&quot; hreflang=&quot;en&quot;&gt;QTreeWidget&lt;/a&gt;&lt;/code&gt;/&lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.3/qlistwidget.html&quot; hreflang=&quot;en&quot;&gt;QListWidget&lt;/a&gt;&lt;/code&gt; qui offrent déjà pas mal de possibilités.&lt;/p&gt;


&lt;p&gt;L'utilisation des modèles dans Qt passe systématiquement par l'héritage d'un des modèles Qt dont l'ancêtre commun est toujours la classe abstraite &lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.3/qabstractitemmodel.html&quot; hreflang=&quot;en&quot;&gt;QAbstractItemModel&lt;/a&gt;&lt;/code&gt;.&lt;br /&gt;
La plupart du temps, vous n'aurez pas besoin d'hériter des vues ainsi que de définir de nouveaux &lt;em&gt;delegates&lt;/em&gt; (ni même vous en soucier pour ces derniers); ceux qui existent déjà suffisent pour la plupart des usages. Néammoins, ce besoin pourra se faire sentir dans certaines circonstances, c'est pourquoi l'écriture d'un delegate particulier et son intégration au sein d'une vue sera abordé dans un autre tutoriel.&lt;/p&gt;


&lt;p&gt;Le concept de MVC est abondamment expliqué dans la documentation officielle Qt et la création d'un modèle simple non hiérarchique est relativement simple à appréhender. Il se peut même que vous n'ayez pas besoin de ce tutoriel car les exemples de Qt en ce qui concerne les modèles/vues sont nombreux et je vous recommande de jeter un oeil aux exemples situés dans le répertoire itemviews du tarball officiel si le parcours d'un tutoriel n'est pas votre tasse de thé.&lt;br /&gt;
Ainsi, tout au long de ce document, nous allons nous concentrer sur le QTreeView et sur la création d'un modèle hiérarchique afin d'expliciter quelques points qui peuvent paraître obscures lorsqu'on s'initie à leur création. Nous tâcherons ainsi d'éclaircir le rôle des diverses méthodes virtuelles à hériter obligatoirement (méthodes abstraites) ou de façon optionnelle afin d'affiner le comportement de notre modèle.&lt;/p&gt;


&lt;h2&gt;Rétro-conception&lt;/h2&gt;


&lt;p&gt;Puisqu'il va falloir indiquer au modèle où trouver nos données et comment se représenter la hiérarchie de celles-ci, il est crucial d'avoir déjà une idée claire et précise de la façon dont nos données sont agencées en mémoire et ce qui les lie les unes aux autres.&lt;br /&gt;
Du côté du modèle, le &lt;code&gt;&lt;a href=&quot;http://doc.trolltech.com/4.3/qmodelindex.html&quot; hreflang=&quot;en&quot;&gt;QModelIndex&lt;/a&gt;&lt;/code&gt; nous offre un moyen simple de mettre en oeuvre les briques élémentaires de la modélisation de nos données.&lt;br /&gt;
Cette classe est le lien entre la donnée élémentaire et le modèle, mais &lt;ins&gt;ne se substitue pas&lt;/ins&gt; à la donnée en elle-même; il est primordial de concevoir une structure de données hiérarchiques interne qui sera utilisée par notre modèle pour créér ses index.&lt;br /&gt;
De façon plus formelle, le &lt;code&gt;QModelIndex&lt;/code&gt; connaît le modèle auquel il appartient, son père&lt;sup&gt;[&lt;a href=&quot;http://doc.qtfr.org/post/2007/12/16/#pnote-171-1&quot; id=&quot;rev-pnote-171-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;, son numéro de ligne (au sein des enfants de ce père, pas le numéro de ligne absolu dans le modèle) ainsi que son numéro de colonne.
Voilà en gros tout dont le modèle a besoin pour construire sa hiérarchie et on expliquera les rôles des autres champs ultérieurement. Pour la suite, pour évoquer le &lt;code&gt;QModelIndex&lt;/code&gt; on parlera simplement d&lt;em&gt;'index&lt;/em&gt;.&lt;/p&gt;


&lt;p&gt;Les structures internes de nos données devront refléter ces propriétés relationnelles, par exemple, il sera indispensable qu'on puisse facilement retrouver le père d'un élément de données. Ranger nos données dans un structure arborescente est donc probablement le meilleur des choix. S'il n'est pas possible de stocker toutes les données en mémoire (typiquement dans le cas d'une base de données), il faudra tout de même pouvoir modéliser ces concepts relationnels &quot;facilement&quot;.&lt;/p&gt;


&lt;p&gt;Comme nous l'avons vu plus haut, concevoir un modèle dans Qt 4, c'est hériter, directement ou indirectement, de la classe &lt;code&gt;QAbstractItemModel&lt;/code&gt; et implémenter un lot de méthodes virtuelles dont certaines sont &lt;em&gt;abstraites&lt;/em&gt; et donc doivent être impérativement héritées sous peine d'erreur de la part du compilateur.&lt;/p&gt;


&lt;p&gt;Ces fonctions abstraites sont&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;QModelIndex &lt;a href=&quot;http://doc.trolltech.com/4.3/qabstractitemmodel.html#index&quot; hreflang=&quot;en&quot;&gt;index&lt;/a&gt;(int row, int column, const QModelIndex &amp;amp; parent = QModelIndex())&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est un peu l'&quot;usine à index&quot; du modèle. Ici vont être créés puis renvoyés les index en fonction d'un numéro de ligne, de colonne et d'un index père.
A chaque fois que l'on aura besoin d'un index quelque part, que ce soit dans le modèle ou à l'extérieur de ce modèle, c'est cette méthode qui sera invoquée (à l'exception de la création des index pères qui seront fabriqués par le biais de la fonction &lt;code&gt;parent()&lt;/code&gt;).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;QModelIndex &lt;a href=&quot;http://doc.trolltech.com/4.3/qabstractitemmodel.html#parent&quot; hreflang=&quot;en&quot;&gt;parent&lt;/a&gt;(const QModelIndex &amp;amp; index)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cette méthode est utilisée pour retrouver un index père en fonction de son fils.
Comme nous l'avons vu plus haut dans l'encadré, cette méthode est directement appelée par la méthode &quot;parent()&quot; de chaque QModelIndex appartenant au modèle.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;int &lt;a href=&quot;http://doc.trolltech.com/4.3/qabstractitemmodel.html#rowCount&quot; hreflang=&quot;en&quot;&gt;rowCount&lt;/a&gt;(const QModelIndex &amp;amp; parent = QModelIndex())&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cette fonction renvoie le nombre de lignes de l'index père passé en paramètre qu'on peut assimiler au nombre d'index enfants de ce père.
Cette méthode peut également se révéler couteuse et dans ce cas, il est parfois utile d'envisager la redéfinition de la méthode &quot;hasChildren()&quot; (cette méthode fait appel à rowCount() dans son implémentation par défaut) qui permet de signaler au modèle qu'un index a des enfants sans pour autant en spécifier combien, et ainsi par exemple afficher un noeud dans la vue qui, impliquera alors un appel à rowCount().&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;int &lt;a href=&quot;http://doc.trolltech.com/4.3/qabstractitemmodel.html#columnCount&quot; hreflang=&quot;en&quot;&gt;columnCount&lt;/a&gt;(const QModelIndex &amp;amp; parent = QModelIndex())&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cette méthode renvoie le nombre de colonnes des enfants de l'index père passé en paramètre. Dans la plupart des cas, cette méthode renverra un nombre non dépendant du père.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;QVariant &lt;a href=&quot;http://doc.trolltech.com/4.3/qabstractitemmodel.html#data&quot; hreflang=&quot;en&quot;&gt;data&lt;/a&gt;(const QModelIndex &amp;amp; index, int role = Qt::DisplayRole)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C'est probablement la fonction la plus sollicitée pendant la vie du modèle; elle permet de connaître les données à afficher dans la vue en fonction d'un index et d'un &lt;em&gt;rôle&lt;/em&gt;.&lt;br /&gt;
Les &lt;em&gt;&lt;a href=&quot;http://doc.trolltech.com/4.3/qt.html#ItemDataRole-enum&quot; hreflang=&quot;en&quot;&gt;rôles&lt;/a&gt;&lt;/em&gt; définissent dans les détails la façon dont une donnée est présentée par les vues associées. On peut par exemple invoquer la méthode &lt;code&gt;data()&lt;/code&gt; pour demander la valeur du texte à afficher par le biais de &lt;code&gt;Qt::DisplayRole&lt;/code&gt; ou alors la couleur de fond de la cellule qui accueuillera le texte avec le paramètre &lt;code&gt;Qt::BackgroundRole&lt;/code&gt;, ou si nécessaire, la police de caractère à utiliser grâce à &lt;code&gt;Qt::FontRole&lt;/code&gt;.&lt;br /&gt;
Les rôles ont été conçus pour être les plus exhaustifs et génériques possibles mais il est possible de les étendre à partir de la valeur &lt;code&gt;Qt::UserRole&lt;/code&gt; qui constitue le premier role &quot;utilisateur&quot;.&lt;br /&gt;
Dans le cas d'une utilisation classique, le rôle essentiel est &lt;code&gt;Qt::DisplayRole&lt;/code&gt; car il concerne directement la donnée (très souvent et en particulier ici du texte) à afficher dans la vue.&lt;br /&gt;
Il faut également garder à l'esprit que &lt;code&gt;data()&lt;/code&gt; étant appelée très fréquemment, il est important de ne pas y trouver de traitements lourds. Typiquement, je ne fais aucun appel aux outils de traduction dans cette méthode, je les déporte dans le constructeur du modèle.&lt;/p&gt;


&lt;p&gt;Puisque Trolltech nous fournit déjà des exemples et des démonstrations de qualité, nous allons appuyer ce tutoriel sur la démo
&lt;a href=&quot;http://doc.trolltech.com/4.3/itemviews-simpletreemodel.html&quot; hreflang=&quot;fr&quot;&gt;simpletreemodel&lt;/a&gt; (sur cette page, vous trouverez également une bonne explication en anglais de cet exemple) disponible dans tout tarball Qt (et dans certains paquets) afin d'expliquer en détail l'implémentation du modèle et les choix effectués.&lt;/p&gt;


&lt;h2&gt;simpletreemodel&lt;/h2&gt;


&lt;h3&gt;Description&lt;/h3&gt;


&lt;p&gt;Cet exemple charge et affiche le contenu dans un arbre (&lt;code&gt;QTreeView&lt;/code&gt;) d'un fichier de type &quot;Sommaire&quot; de livre.
Ce fichier est un ensemble de lignes de texte plus ou moins en retrait par le biais de caractères d'espacement.
Par exemple, une ligne qui commence par 8 espaces et qui précède une ligne qui débute par 4 espaces sera considérée comme &quot;fille&quot; de la ligne précédente.
Chaque ligne de texte est séparée en deux par un ensemble de tabulations, cet ensemble de tabulation permettra de diviser la ligne en deux colonnes dans l'arbre.
Ainsi nous avons donc un arbre à deux colonnes décrit au sein d'un fichier texte et dont voici un extrait&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
Form Editing Mode                       How to edit a form in Qt Designer
    Managing Forms                      Loading and saving forms
...
    Layouts                             Objects that arrange widgets on a form
        Applying and Breaking Layouts   Managing widgets in layouts
&lt;/pre&gt;


&lt;h3&gt;Exécution&lt;/h3&gt;


&lt;p&gt;Au lancement du programme, un modèle (implémenté dans treemodel.h/treemodel.cpp) est créé avec en paramètre le texte du fichier &quot;default.txt&quot; chargé pour l'occasion. Ce texte est &quot;parsé&quot; (analysé et stocké dans une structure de données) pendant la construction du modèle, ce qui permettra son utilisation immédiate plus tard sans autre forme d'initialisation.
Puis, un &lt;code&gt;QTreeView&lt;/code&gt; est également créé et on lui affecte le modèle.
On attribue un titre à cet arbre puis il est affiché et la boucle d'évènements est lancée; le programme est réellement visuellement disponible à ce moment là et nous pouvons voir à l'écran le &lt;code&gt;QTreeView&lt;/code&gt; en action et le manipuler à notre guise.&lt;/p&gt;


&lt;h3&gt;Analyse&lt;/h3&gt;


&lt;h4&gt;Le stockage des données&lt;/h4&gt;


&lt;p&gt;Examinons tout d'abord le contenu de treeitem.h/.cpp.
La classe &lt;code&gt;TreeItem&lt;/code&gt; est conçue pour stocker une hiérarchie de données. Voici ses caractéristiques&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;parentItem&lt;/code&gt; pointe vers son élément père.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;childItems&lt;/code&gt; est une liste de pointeurs vers les fils de cet élément.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;itemData&lt;/code&gt; contient les données de l'élément sous forme de liste de QVariant (qui est le type générique de Qt, voir la documentation).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour cet exemple, l'auteur aurait pu se contenter pour &lt;code&gt;itemData&lt;/code&gt; d'une liste de &lt;code&gt;QString&lt;/code&gt;, mais le &lt;code&gt;QVariant&lt;/code&gt; permet d'imaginer un enrichissement de l'exemple afin de pouvoir stocker et afficher des types de données hétéroclytes au sein de la même liste. Il permet surtout d'être directement renvoyé par la méthode &lt;code&gt;data()&lt;/code&gt; du modèle sans aucune conversion comme nous le verrons plus tard.
A l'image d'une liste chaînée, l'arbre entier est accessible par sa racine et lorsqu'on détruit un &lt;code&gt;TreeItem&lt;/code&gt;, ses enfants sont également détruits. Notez à ce titre l'utilisation de &lt;code&gt;qDeleteAll()&lt;/code&gt;, fonction bien pratique qui permet de détruire tous les objets pointés stockés dans une structure de données Qt (QList, QVector, etc).&lt;/p&gt;


&lt;p&gt;Voilà qui permet de conclure sur cette classe &quot;jumelle&quot; à la hiérarchie des index et qui servira de conteneur de données librement consultable par le modèle de notre vue.&lt;/p&gt;


&lt;h4&gt;Le modèle&lt;/h4&gt;


&lt;p&gt;Intéressons-nous maintenant à la classe &lt;code&gt;TreeModel&lt;/code&gt; définie dans treemodel.h/.cpp.&lt;/p&gt;


&lt;p&gt;La méthode &lt;code&gt;setupModelData()&lt;/code&gt; contient le code le plus complexe de l'exemple :-), il analyse le texte en paramètre et en déduit une hiérarchie de TreeItems qu'il lie au noeud parent passé en paramètre. Cette fonction est appelée uniquement dans le constructeur avec &lt;code&gt;rootData&lt;/code&gt; préalablement créé. Ce noeud racine sera le point d'accès à l'arbre de données pour le modèle.&lt;/p&gt;


&lt;p&gt;En dehors de &lt;code&gt;setupModelData()&lt;/code&gt;, le reste des méthodes présentes sont des éléments hérités appartenant au &lt;code&gt;QAbstractItemModel&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;


&lt;h5&gt;La méthode &lt;code&gt;parent()&lt;/code&gt;&lt;/h5&gt;

&lt;pre class=&quot;cpp&quot;&gt;QModelIndex TreeModel::&lt;span style=&quot;color: #00eeff;&quot;&gt;parent&lt;/span&gt;&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; QModelIndex &amp;amp;index&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;if&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;!index.&lt;span style=&quot;color: #00eeff;&quot;&gt;isValid&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: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; QModelIndex&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;/pre&gt;


&lt;p&gt;Le but de la méthode &lt;code&gt;parent()&lt;/code&gt; est de créer et renvoyer un &lt;code&gt;QModelIndex&lt;/code&gt; correspondant au père du &lt;code&gt;QModelIndex&lt;/code&gt; en paramètre.
Si l'index en paramètre est considéré comme orphelin dans l'arbre, alors il convient de renvoyer un index invalide.
Dans notre cas, un index racine est un index correspondant à un &lt;code&gt;TreeItem&lt;/code&gt; dont le père est &lt;code&gt;rootData&lt;/code&gt;.
&lt;code&gt;rootData&lt;/code&gt; est le seul élément dans tout l'arbre des &lt;code&gt;TreeItem&lt;/code&gt; qui n'a aucun &lt;code&gt;QModelIndex&lt;/code&gt; correspondant, il sert juste de père ultime référent et donc, les vrais éléments racines de l'arbre affichés à l'écran sont ses enfants directs.
&lt;code&gt;parent()&lt;/code&gt; est également une méthode publique. Rien que pour cette raison il est important de tester le cas où l'index en paramètre est invalide.
Le père d'un index invalide est donc naturellement ... un index invalide, créé par le biais du constructeur vide du &lt;code&gt;QModelIndex&lt;/code&gt;.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;TreeItem *childItem = static_cast&amp;lt;TreeItem*&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;index.&lt;span style=&quot;color: #00eeff;&quot;&gt;internalPointer&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: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    TreeItem *parentItem = childItem-&amp;gt;parent&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;/pre&gt;


&lt;p&gt;&lt;code&gt;internalPointer&lt;/code&gt; est une variable qui fait le lien entre l'index et la donnée. Chaque index du modèle sera donc lié à un &lt;code&gt;TreeItem&lt;/code&gt; cette liaison est faite à deux endroits du modèle; la méthode &lt;code&gt;index()&lt;/code&gt; et la méthode &lt;code&gt;parent()&lt;/code&gt;.
La première instruction se contente donc de récupérer le &lt;code&gt;TreeItem&lt;/code&gt; associé à l'index, en passant par un &lt;code&gt;static_cast&lt;/code&gt;, plus rapide qu'un &lt;code&gt;dynamic_cast&lt;/code&gt; et suffisant ici.
Il existe un autre moyen de lier une donnée à un index, &lt;code&gt;internalId&lt;/code&gt; qui est une autre propriété du &lt;code&gt;QModelIndex&lt;/code&gt;, utile dans les cas où la donnée serait accessible via un identificateur entier et non un pointeur. (on peut imaginer une clef entière dans une base de donnée, par exemple).
La seconde instruction stocke le père du &lt;code&gt;TreeItem&lt;/code&gt; prédédemment extrait dans &lt;code&gt;parentItem&lt;/code&gt;.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&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;parentItem == rootItem&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; QModelIndex&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;/pre&gt;


&lt;p&gt;Nous avons vu que chaque &lt;code&gt;TreeItem&lt;/code&gt; pointe vers son père, si l'élément père est &lt;code&gt;rootItem&lt;/code&gt;, alors on considère du point de vue du modèle que l'index correspondant est un noeud racine et donc, on renvoie un &lt;code&gt;QModelIndex&lt;/code&gt; invalide.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; createIndex&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;parentItem-&amp;gt;row&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;, parentItem&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;&lt;code&gt;createIndex()&lt;/code&gt;&lt;sup&gt;[&lt;a href=&quot;http://doc.qtfr.org/post/2007/12/16/#pnote-171-2&quot; id=&quot;rev-pnote-171-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt; est une méthode qui permet de créer en une instruction un &lt;code&gt;QModelIndex&lt;/code&gt; attaché au modèle.&lt;/p&gt;


&lt;p&gt;La méthode &lt;code&gt;row()&lt;/code&gt; du TreeItem renvoie le numéro de ligne de l'élément au sein de ses frères et c'est exactement ce que &lt;code&gt;createIndex&lt;/code&gt; attend comme premier paramètre.
0 est passé comme numéro de colonne car le père d'un index est par convention toujours de colonne 0 dans un système hiérarchique conventionnel.
Et enfin, &lt;code&gt;parentItem&lt;/code&gt; est passé en tant que comme pointeur interne, c'est un des deux endroits dans le code où l'on associe un &lt;code&gt;TreeItem&lt;/code&gt; à son &lt;code&gt;QModelIndex&lt;/code&gt;.&lt;/p&gt;


&lt;h5&gt;La méthode &lt;code&gt;index()&lt;/code&gt;&lt;/h5&gt;

&lt;pre class=&quot;cpp&quot;&gt;QModelIndex TreeModel::&lt;span style=&quot;color: #00eeff;&quot;&gt;index&lt;/span&gt;&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; row, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; column, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; QModelIndex &amp;amp;parent&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;if&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;!hasIndex&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;row, column, parent&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: #0000ff;&quot;&gt;return&lt;/span&gt; QModelIndex&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;/pre&gt;


&lt;p&gt;La méthode &lt;code&gt;index()&lt;/code&gt; est publique. Il convient donc de tester ses paramètres afin de résoudre les cas invalides.
En particulier, nous aimerions savoir si les paramètres &lt;code&gt;row&lt;/code&gt; et &lt;code&gt;column&lt;/code&gt; ne sortent pas des limites du modèle et heureusement, pour le savoir, il existe la fonction &lt;code&gt;hasIndex()&lt;/code&gt; qui nous renseigne à ce sujet. La documentation étant peu locace pour cette fonction, c'est dans les sources de Qt que nous allons trouver son rôle précis; cette méthode renvoie vrai si et seulement si les paramètres &lt;code&gt;row&lt;/code&gt; et &lt;code&gt;column&lt;/code&gt; sont compris entre 0 et le nombre maximum de lignes et de colonnes du parent passé en paramètre.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;TreeItem *parentItem;
&amp;nbsp;
    &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;!parent.&lt;span style=&quot;color: #00eeff;&quot;&gt;isValid&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: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
        parentItem = rootItem;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;
        parentItem = static_cast&amp;lt;TreeItem*&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;parent.&lt;span style=&quot;color: #00eeff;&quot;&gt;internalPointer&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: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/pre&gt;


&lt;p&gt;Ici nous avons besoin de récupérer l'élément de type &lt;code&gt;TreeItem&lt;/code&gt; correspondant à l'index que nous allons renvoyer.
Nous savons que si le paramètre &lt;code&gt;parent&lt;/code&gt; est valide, alors il aura été créé avec &lt;code&gt;parent()&lt;/code&gt; et possèdera donc en pointeur interne sur son &lt;code&gt;TreeItem&lt;/code&gt; &quot;jumeau&quot; et, dans le cas où &lt;code&gt;parent&lt;/code&gt; est invalide, c'est &lt;code&gt;rootItem&lt;/code&gt; qui jouera ce rôle.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;TreeItem *childItem = parentItem-&amp;gt;child&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;row&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;childItem&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; createIndex&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;row, column, childItem&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: #0000ff;&quot;&gt;return&lt;/span&gt; QModelIndex&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;/pre&gt;


&lt;p&gt;Maintenant que nous avons l'élément père ainsi que le numéro de ligne du fils, il est trivial d'en déduire l'élément fils avec la méthode &lt;code&gt;child()&lt;/code&gt;. Par prudence, le retour de cette méthode est testé et &lt;code&gt;createIndex()&lt;/code&gt; est à nouveau invoqué puis retourné par la fonction.&lt;/p&gt;


&lt;h5&gt;La méthode &lt;code&gt;data()&lt;/code&gt;&lt;/h5&gt;

&lt;pre class=&quot;cpp&quot;&gt;QVariant TreeModel::&lt;span style=&quot;color: #00eeff;&quot;&gt;data&lt;/span&gt;&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; QModelIndex &amp;amp;index, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; role&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;if&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;!index.&lt;span style=&quot;color: #00eeff;&quot;&gt;isValid&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: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; QVariant&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;/pre&gt;


&lt;p&gt;Nous retrouvons le même début de scénario que pour les deux méthodes précédemment analysées, &lt;code&gt;data()&lt;/code&gt; étant public, la validité de &lt;code&gt;index&lt;/code&gt; est éprouvée et un QVariant() invalide est envoyé le cas échéant.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&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;role != Qt::&lt;span style=&quot;color: #00eeff;&quot;&gt;DisplayRole&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; QVariant&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;/pre&gt;


&lt;p&gt;Dans cette démo, la vue ne sollicitera que le texte pour son affichage, et donc, tous les rôles autre que &lt;code&gt;Qt::DisplayRole&lt;/code&gt; sont écartés. Pour se faire, un &lt;code&gt;QVariant()&lt;/code&gt; invalide est renvoyé et signifie à l'appelant qu'il fait ce qu'il veut: pour un &lt;code&gt;QTreeView&lt;/code&gt;, ça sera par exemple d'afficher la couleur de fond par défaut du composant dans le cas du &lt;code&gt;Qt::BackgroundRole&lt;/code&gt;.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;TreeItem *item = static_cast&amp;lt;TreeItem*&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;index.&lt;span style=&quot;color: #00eeff;&quot;&gt;internalPointer&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: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; item-&amp;gt;data&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;index.&lt;span style=&quot;color: #00eeff;&quot;&gt;column&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: #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;Nous avons besoin de retrouver l'élément correspondant à l'index, puis de renvoyer la donnée correspondant à son numéro de colonne.
La méthode &lt;code&gt;data()&lt;/code&gt; renvoie un &lt;code&gt;QVariant&lt;/code&gt; et nous voyons ici l'utilité sémantique d'avoir stocké une liste de &lt;code&gt;QVariant&lt;/code&gt; au sein du &lt;code&gt;TreeItem&lt;/code&gt; plutôt qu'une liste de &lt;code&gt;QString&lt;/code&gt;, même si en l'occurrence, le renvoi d'un &lt;code&gt;QString&lt;/code&gt; aurait été possible grace à la construction implicite du C++.&lt;/p&gt;


&lt;h5&gt;La méthode &lt;code&gt;rowCount()&lt;/code&gt;&lt;/h5&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; TreeModel::&lt;span style=&quot;color: #00eeff;&quot;&gt;rowCount&lt;/span&gt;&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; QModelIndex &amp;amp;parent&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;
    TreeItem *parentItem;
    &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;parent.&lt;span style=&quot;color: #00eeff;&quot;&gt;column&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;gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;0&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;/pre&gt;


&lt;p&gt;Nous avons vu plus haut que le père d'un index a par convention son numéro de colonne égal à 0 dans un cas de hiérarchie classique.
De la même façon, tout index de colonne strictement supérieur à 0 ne possède aucun fils; ce rôle est dévolu à l'index de colonne 0.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&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;!parent.&lt;span style=&quot;color: #00eeff;&quot;&gt;isValid&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: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
        parentItem = rootItem;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;
        parentItem = static_cast&amp;lt;TreeItem*&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;parent.&lt;span style=&quot;color: #00eeff;&quot;&gt;internalPointer&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: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; parentItem-&amp;gt;childCount&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;/pre&gt;


&lt;p&gt;Comme pour la fonction &lt;code&gt;data()&lt;/code&gt;, il nous faut extraire le &lt;code&gt;TreeItem&lt;/code&gt; correspondant à l'index &lt;code&gt;parent&lt;/code&gt;.
L'appel de &lt;code&gt;rowCount()&lt;/code&gt; avec un index invalide signifie que l'utilisateur souhaite le nombre de noeuds racines, dans ce cas, &lt;code&gt;rootItem&lt;/code&gt; jouera le rôle de l'élément père.
Le nombre d'enfants de l'élément père est alors renvoyé.&lt;/p&gt;


&lt;h5&gt;La méthode &lt;code&gt;columnCount()&lt;/code&gt;&lt;/h5&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; TreeModel::&lt;span style=&quot;color: #00eeff;&quot;&gt;columnCount&lt;/span&gt;&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; QModelIndex &amp;amp;parent&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;if&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;parent.&lt;span style=&quot;color: #00eeff;&quot;&gt;isValid&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: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; static_cast&amp;lt;TreeItem*&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;parent.&lt;span style=&quot;color: #00eeff;&quot;&gt;internalPointer&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: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;-&amp;gt;columnCount&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;else&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; rootItem-&amp;gt;columnCount&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;/pre&gt;


&lt;p&gt;Elle est similaire à la méthode &lt;code&gt;rowCount()&lt;/code&gt; si ce n'est une difficulté en moins puisque que l'on peut se contenter de renvoyer directement le nombre de colonnes de l'élément attaché à l'index.&lt;/p&gt;


&lt;h5&gt;Les méthodes &lt;code&gt;flags()&lt;/code&gt; et &lt;code&gt;headerData()&lt;/code&gt;&lt;/h5&gt;

&lt;pre class=&quot;cpp&quot;&gt;Qt::&lt;span style=&quot;color: #00eeff;&quot;&gt;ItemFlags&lt;/span&gt; TreeModel::&lt;span style=&quot;color: #00eeff;&quot;&gt;flags&lt;/span&gt;&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; QModelIndex &amp;amp;index&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;if&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;!index.&lt;span style=&quot;color: #00eeff;&quot;&gt;isValid&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: #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;;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; Qt::&lt;span style=&quot;color: #00eeff;&quot;&gt;ItemIsEnabled&lt;/span&gt; | Qt::&lt;span style=&quot;color: #00eeff;&quot;&gt;ItemIsSelectable&lt;/span&gt;;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;C'est dans cette fonction que nous allons définir finement le comportement du modèle.
Nous lui précisons ici que nous souhaitons pouvoir intéragir avec l'index en paramètre (&lt;code&gt;Qt::ItemIsEnabled&lt;/code&gt;), ainsi que le sélectionner (&lt;code&gt;Qt::ItemIsSelectable&lt;/code&gt;).&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;QVariant TreeModel::&lt;span style=&quot;color: #00eeff;&quot;&gt;headerData&lt;/span&gt;&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; section, Qt::&lt;span style=&quot;color: #00eeff;&quot;&gt;Orientation&lt;/span&gt; orientation,
                               &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; role&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;if&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;orientation == Qt::&lt;span style=&quot;color: #00eeff;&quot;&gt;Horizontal&lt;/span&gt; &amp;amp;&amp;amp; role == Qt::&lt;span style=&quot;color: #00eeff;&quot;&gt;DisplayRole&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; rootItem-&amp;gt;data&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;section&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; QVariant&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;/pre&gt;


&lt;p&gt;&lt;code&gt;headerData()&lt;/code&gt; est similaire à la fonction &lt;code&gt;data()&lt;/code&gt; si ce n'est qu'elle concerne uniquement les entêtes des lignes et colonnes. Pour notre exemple, seule l'entête des colonnes est affichée et nous utilisons donc à cette fin les valeurs de &lt;code&gt;rootItem&lt;/code&gt; uniquement dans le cas où l'orientation est &lt;code&gt;Qt::Horizontal&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;Conclusion&lt;/h2&gt;


&lt;p&gt;Pour des raisons de simplicité, j'ai jugé utile de limiter ce tutoriel à l'analyse d'un exemple simple et en lecture seule et de nombreux aspects de la manipulation des modèles/vue n'y sont pas abordés.
Par exemple, lorsqu'on veut modifier les données internes, comment avertir le modèle -et donc la vue- que les données ont changées&amp;nbsp;? Comment rendre le modèle éditable; doit-on utiliser les méthodes d'insertions et de suppression du modèle ou un système alternatif&amp;nbsp;? L'édition des données est trop basique, je voudrais la changer, comment faire&amp;nbsp;? Comment construire un système de recherche au sein d'un modèle&amp;nbsp;? Comment gérer les types Mime ainsi que le drag'n'drop&amp;nbsp;?
Ces questions seront abordées dans un tutoriel plus avancé.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://doc.qtfr.org/post/2007/12/16/#rev-pnote-171-1&quot; id=&quot;pnote-171-1&quot;&gt;1&lt;/a&gt;] Si les valeurs renvoyées par &lt;code&gt;row()&lt;/code&gt;, &lt;code&gt;column()&lt;/code&gt; et &lt;code&gt;model()&lt;/code&gt; appartiennent bien en interne au &lt;code&gt;QModelIndex&lt;/code&gt; par le biais de champs privés, le champ &lt;code&gt;parent()&lt;/code&gt; est en revanche une invocation directe de la méthode virtuelle pure &lt;code&gt;parent()&lt;/code&gt; du modèle de l'index. Ceci peut mettre en lumière le rôle de la fonction &lt;code&gt;parent()&lt;/code&gt; du modèle et son implication.&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://doc.qtfr.org/post/2007/12/16/#rev-pnote-171-2&quot; id=&quot;pnote-171-2&quot;&gt;2&lt;/a&gt;] Il existe un constructeur du &lt;code&gt;QModelIndex&lt;/code&gt; qui accepte à peu près les mêmes paramètres que &lt;code&gt;createIndex()&lt;/code&gt; et qui aurait pu prendre sa place mais pour des raisons d'intégrité et de cohérence (pour ne jamais avoir d'index sans modèle référent), ce constructeur est privé; le seul moyen de créer un index valide est de passer par le modèle et donc par une des déclinaisons de &lt;code&gt;createIndex()&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
      </item>
    
  <item>
    <title>Initiation à Qt Jambi</title>
    <link>http://doc.qtfr.org/post/2007/11/25/Initiation-a-Qt-Jambi</link>
    <guid isPermaLink="false">urn:md5:0dad52d26de82a5be8779ddfee0a0136</guid>
    <pubDate>Sun, 25 Nov 2007 22:05:00 +0100</pubDate>
    <dc:creator>Visiteur</dc:creator>
        <category>Tutoriels</category>
        <category>class_QDialog</category><category>class_QMenu</category><category>class_QWidget</category><category>installation</category><category>signaux-slots</category><category>version_Jambi</category>    
    <description>&lt;p&gt;Ce tutoriel vous permettra de découvrir le fonctionnement de Qt Jambi progressivement.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Jambi &lt;br /&gt;
&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://forum.qtfr.org/profile.php?id=2374&quot;&gt;Natim&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;Ce tutoriel est disponible sur le site du zéro: &lt;a href=&quot;http://www.siteduzero.com/tuto-3-5556-0-du-qt-en-java-avec-qt-jambi.html&quot;&gt;y accéder&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;L'utilisateur découvrira:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comment installer Jambi&lt;/li&gt;
&lt;li&gt;Comment créer une fenêtre de base en utilisant des layouts&lt;/li&gt;
&lt;li&gt;Le fonctionnement des signaux et slots de Qt&lt;/li&gt;
&lt;li&gt;et pour finir, réalisera un petit éditeur de texte et un visualisateur d'images.&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Rapid GUI Programming with Python and Qt</title>
    <link>http://doc.qtfr.org/post/2007/11/25/Rapid-GUI-Programming-with-Python-and-Qt</link>
    <guid isPermaLink="false">urn:md5:059ab3483cd6e9db77e42dbd0960a4e7</guid>
    <pubDate>Sun, 25 Nov 2007 15:27:00 +0100</pubDate>
    <dc:creator>Visiteur</dc:creator>
        <category>Livres</category>
        <category>livre</category><category>version_PyQt4</category>    
    <description>&lt;p&gt;Mark Summerfield déjà co-auteur du célèbre livre &lt;a href=&quot;http://doc.qtfr.org/post/2007/02/20/C-GUI-Programming-with-Qt-4&quot; hreflang=&quot;fr&quot;&gt;C++ GUI Programming with Qt 4&lt;/a&gt; (traduit en Français aux éditions Pearson Education) nous livre un nouvel opus sur la librairie Qt4 mais dédié cette fois-ci au language Python.&lt;/p&gt;


&lt;p&gt;Merci à &lt;a href=&quot;http://kib2.free.fr/&quot; hreflang=&quot;fr&quot;&gt;tool69&lt;/a&gt; pour cette revue, qui donne envie de se plonger dans la lecture de cet ouvrage.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://forum.qtfr.org/profile.php?id=428&quot;&gt;tool69&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://vig.prenhall.com/catalog/academic/product/0,1144,0132354187,00.html&quot;&gt;&lt;img src=&quot;http://doc.qtfr.org/public/livres/rapidguipyqt.png&quot; alt=&quot;rapidguipyqt.png&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Informations&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Auteurs&lt;/em&gt;&amp;nbsp;: Mark Summerfield&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Editeur&lt;/em&gt;&amp;nbsp;: &lt;a href=&quot;http://vig.prenhall.com/&quot; hreflang=&quot;en&quot;&gt;Prentice Hall PTR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Langue&lt;/em&gt;&amp;nbsp;: anglais&lt;/li&gt;
&lt;li&gt;&lt;em&gt;ISBN&lt;/em&gt;&amp;nbsp;: 0132354187&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Pages&lt;/em&gt;&amp;nbsp;: 460&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Public visé&lt;/em&gt;&amp;nbsp;: tout développeur Python, même débutant&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Page du livre&lt;/em&gt;&amp;nbsp;: &lt;a href=&quot;http://www.qtrac.eu/pyqtbook.html&quot; hreflang=&quot;en&quot;&gt;http://www.qtrac.eu/pyqtbook.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Résumé et revue&lt;/h3&gt;

&lt;p&gt;Mark Summerfield déjà co-auteur du célèbre livre &lt;a href=&quot;http://doc.qtfr.org/post/2007/02/20/C-GUI-Programming-with-Qt-4&quot; hreflang=&quot;fr&quot;&gt;C++ GUI Programming with Qt 4&lt;/a&gt; (traduit en Français aux éditions Pearson Education) nous livre un nouvel opus sur la librairie Qt4 mais dédiée cette fois-ci au language Python.&lt;/p&gt;


&lt;p&gt;Parlons de la qualité du livre lui-même&amp;nbsp;: une belle couverture rigide sur laquelle figure l'image du satellite Hubble en orbite autour de la Terre. Le sens&amp;nbsp;? Python est utilisé par la NASA pour calibrer et analyser les données recueillies par celui-ci. Que ce soit le papier, la qualité d'impression ou les multiples diagrammes, il n'y a rien à redire si ce n'est qu'on aimerait voir ce genre d'initiatives plus souvent chez nos éditeurs, surtout eû égard au prix pratiqué.&lt;/p&gt;


&lt;p&gt;Passons maintenant au contenu proprement dit, qui se divise en quatre parties distinctes (cinq en fait si l'on compte les divers appendices qui représentent à eux seuls presque une centaine de pages)&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Programmation avec Python;&lt;/li&gt;
&lt;li&gt;Programmation d'interfaces graphiques niveau basique;&lt;/li&gt;
&lt;li&gt;Programmation d'interfaces graphiques niveau intermédiaire;&lt;/li&gt;
&lt;li&gt;Programmation d'interfaces graphiques niveau avancé;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On peut s'interroger sur le bien fondé de la première partie, en effet il serait étonnant qu'une personne ne connaissant pas le language se risque à acheter un tel livre. Et pourtant Mark réussi là un véritable tour de force&amp;nbsp;: on balaye les fonctionnalités du language par la pratique, avec des exemples vraiment très pertinents. J'avoue même avoir appris certains concepts dont je ne soupçonnais pas l'existence, sans doute faute d'en avoir eû un réel besoin. Les fonctions partielles par exemple ont un intérêt certain dans la suite de l'ouvrage. De la même façon, vous pourrez y voir de multiples références au PEPs (Python Enhancement Proposals&amp;nbsp;: les fonctionnalités à venir de Python).&lt;/p&gt;


&lt;p&gt;Si l'anglais peut rebuter au départ, surtout lorsqu'il est technique, on se surprend rapidement à lire un thème donné sans avoir recours au dictionnaire (je précise que je n'ai aucune thèse en anglais). Le style se veut simple et efficace, sans être simpliste.&lt;/p&gt;


&lt;p&gt;Autant vous rassurer tout de suite, le contenu des trois parties consacrées au vif du sujet, la programmation d'interfaces graphiques n'est pas du tout un plagiat du livre précédent&amp;nbsp;: &lt;em&gt;C++ GUI Programming with Qt 4&lt;/em&gt;. On y aborde évidemment plus ou moins les mêmes sujets, mais un réel travail a été fourni sur les nouvelles fonctionnalités apparues depuis la version 4.2 de Qt4. Citons par exemple un chapitre entier consacré à l'architecture du Graphics view&amp;nbsp;: un réel plus par rapport au livre précédent.&lt;/p&gt;


&lt;p&gt;Les exemples sont abondants, collent à la pratique et vous pourrez en outre les récupérez gratuitement sur la &lt;a href=&quot;http://www.qtrac.eu/pyqtbook.html&quot; hreflang=&quot;en&quot;&gt;page&lt;/a&gt; que Marc à consacré à son ouvrage. Sachez du reste qu'elle est remise à jour régulièrement, afin d'améliorer encore certains exemples et de proposer un errata.&lt;/p&gt;


&lt;p&gt;Citons aussi quelques petits &lt;strong&gt;cadeaux&lt;/strong&gt; vraiment bien venus&amp;nbsp;: des utilitaires écrits par l'auteur afin de gérer au mieux vos projets PyQt4.&lt;/p&gt;


&lt;p&gt;A chaque fois, on vous place en situation de développeur et vous serez amené à résoudre quelques exercices proposés en fin de chapitre.&lt;/p&gt;


&lt;p&gt;J'ai beaucoup apprécié l'éventail d'alternatives à un problème donné. Comment imprimer le contenu d'un &lt;code&gt;QTextEdit&lt;/code&gt; par exemple&amp;nbsp;? Marc vous propose trois méthodes abondamment commentées, de la plus simple à la plus complexe, à vous de choisir ensuite en fonction de vos besoins, de votre niveau ou du temps que vous allez y passer.&lt;/p&gt;


&lt;p&gt;Vous l'aurez donc compris, j'ai été plus que séduit par ce livre. On ne passe pas son temps à comparer Qt à tel autre toolkit comme le font certains ouvrages (d'ailleurs, serait-ce vraiment la peine ?), on pratique avant tout, et les repères ne manquent pas: index abondant, diagrammes de classes, éventail visuel de tous les widgets.&lt;/p&gt;


&lt;p&gt;Des critiques&amp;nbsp;? Un chapitre de &lt;em&gt;C++ GUI Programming with Qt 4&lt;/em&gt; était consacré au développement de plugins avec C++, il est absent ici, comme dans tout livre sur Python consacré à ce vaste sujet. Il est vrai que les possibilités dynamiques qu'offrent Python permettent de pallier à ce problème assez facilement, mais encore faut-il mettre la main à la pâte. S'il est absent, c'est à mon avis surtout parce qu'il n'existe pas de recette toute faite, mais j'aurais au moins aimé disséquer un exemple simple sur le sujet.&lt;/p&gt;


&lt;p&gt;Enfin contrairement à beaucoup d'autres ouvrages, &lt;a href=&quot;http://www.qtrac.eu/pyqtbook.html&quot; hreflang=&quot;en&quot;&gt;Rapid GUI Programming with Python and Qt&lt;/a&gt; se distingue aussi par la façon dont il a été écrit. Pas de LaTeX, de Scribus, de QuarkXPress ni même de InDesign ici, mais une alternative originale et légère&amp;nbsp;: &lt;a href=&quot;http://www.qtrac.eu/lout.html&quot; hreflang=&quot;en&quot;&gt;Lout&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Au secours, mes slots ne fonctionnent pas</title>
    <link>http://doc.qtfr.org/post/2007/06/22/Au-secours-mes-slots-ne-fonctionnent-pas</link>
    <guid isPermaLink="false">urn:md5:ab8780c16e8985d80d33b375582dcfcb</guid>
    <pubDate>Fri, 22 Jun 2007 22:20:00 +0200</pubDate>
    <dc:creator>lud42fr</dc:creator>
        <category>Documentation</category>
        <category>signaux-slots</category>    
    <description>&lt;p&gt;Une liste de points à appliquer pour réussir ses connexions entre signaux et slots.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Qt3, Qt4 &lt;br /&gt;
&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: Ludo (&lt;a href=&quot;http://forum.qtfr.org/profile.php?id=1041&quot;&gt;lud42fr&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;    &lt;h2&gt;Don't panic&lt;/h2&gt;


&lt;h3&gt;Premier diagnostic:&lt;/h3&gt;


&lt;p&gt;Lorsque qu'un slot n'est pas appelé, il y a trois solutions&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Je n'ai pas lu la &lt;a href=&quot;http://doc.trolltech.com/4.3/signalsandslots.html&quot; hreflang=&quot;fr&quot;&gt;doc&lt;/a&gt; et je le regrette&lt;/li&gt;
&lt;li&gt;Le signal n'est pas émis et ce document est trop général pour répondre à ce cas&amp;nbsp;!&lt;/li&gt;
&lt;li&gt;Le slot est mal connecté et le chapitre suivant décrit les bons réflexes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Premiers réflexes:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Rester détendu&lt;/li&gt;
&lt;li&gt;Vérifier sur la console les messages d'erreur&lt;/li&gt;
&lt;li&gt;Vérifier que la classe débute par la macro Q_OBJECT&lt;/li&gt;
&lt;li&gt;Vérifier, en cas d'héritage multiple, que la première classe héritée est un descendant de QObject&lt;/li&gt;
&lt;li&gt;Vérifier la syntaxe de la connexion&lt;/li&gt;
&lt;li&gt;Vérifier que les signatures sont correctes&lt;/li&gt;
&lt;li&gt;Vérifier que la signature du signal est la &lt;strong&gt;même&lt;/strong&gt; que celle du slot&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;L'action au ralenti&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mettre un grand coup de latte&lt;/strong&gt; dans l'UC, ça ne corrige pas le problème, mais ça permet de l'aborder détendu.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vérifier sur la console&lt;/strong&gt; (voir activer la console en annexe A), &lt;strong&gt;que Qt ne signale pas une ou plusieurs erreurs&lt;/strong&gt; concernant la connexion à l'exécution (les erreurs de connexion n'apparaissent qu'a l'exécution)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;Les messages peuvent prendre plusieurs formes et tenir sur plusieurs lignes, mais ont tous en commun, le fait de débuter par &lt;strong&gt;Object::connect:&lt;/strong&gt;
Par exemple l'affichage pour une seule connexion défaillante:&lt;/p&gt;&lt;/blockquote&gt;
&lt;pre class=&quot;cpp&quot;&gt;Object::&lt;span style=&quot;color: #00eeff;&quot;&gt;connect&lt;/span&gt;: Parentheses expected, slot MainWindow::&lt;span style=&quot;color: #666666;&quot;&gt;''&lt;/span&gt;
   Object::&lt;span style=&quot;color: #00eeff;&quot;&gt;connect&lt;/span&gt;:  &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;sender name:   &lt;span style=&quot;color: #666666;&quot;&gt;'test'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;''&lt;/span&gt;
   Object::&lt;span style=&quot;color: #00eeff;&quot;&gt;connect&lt;/span&gt;:  &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;receiver name: &lt;span style=&quot;color: #666666;&quot;&gt;'WindowMain'&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vérifier que la classe débute par la macro Q_OBJECT&lt;/strong&gt;&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;La classe qui contient le slot (ou le signal d'ailleurs) doit débuter par la macro Q_OBJECT.
Ce mot clé est repéré par le meta-object-compiler (moc) et permet de générer le code nécessaire à la recherche et à l'identification des slots, code qui sera utilisé par la méthode connect.
Ex:&lt;/p&gt;&lt;/blockquote&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; maClasse : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QObject
   &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
    Q_OBJECT
    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:
   &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vérifier, en cas d'héritage multiple, que la première classe héritée est un descendant de QObject&lt;/strong&gt;&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;Erreur classique lorsqu'on utilise une interface (classe abstraite, n'héritant pas de QObject), elle est difficile à trouver. Pour l'éviter, il suffit de prendre l'habitude de toujours mettre la classe descendant de QObject en premier.
Par exemple, ceci donnera une erreur&amp;nbsp;:&lt;/p&gt;&lt;/blockquote&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; maClasse : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; MonInterface, &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QObject
   &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
    Q_OBJECT
    ...
   &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;

&lt;blockquote&gt;&lt;p&gt;Il suffit alors de changer l'ordre d'héritage pour que ça marche:&lt;/p&gt;&lt;/blockquote&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; maClasse : &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; MonInterface
   &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
    Q_OBJECT
    ...
   &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vérifier dans le code, que la syntaxe de la connexion est correcte&lt;/strong&gt;&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;pour cela on rappelle la méthode connect (la plus courante) :&lt;br /&gt;
&lt;em&gt;connect(pointeur_sur_l_objet_emetteur, SIGNAL(signature_du_signal),pointeur_sur_l_objet_receveur, SLOT(signature_du_slot));&lt;/em&gt;&lt;br /&gt;
A noter qu'il est possible de connecter un signal à un autre signal, le principe reste le même :&lt;br /&gt;
&lt;em&gt;connect(pointeur_sur_l_objet_emetteur, SIGNAL(signature_du_signal_emetteur),pointeur_sur_l_objet_receveur,SIGNAL(signature_du_signal_receveur));&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;
Passons &lt;em&gt;pointeur_sur_l_objet_emetteur&lt;/em&gt; et  &lt;em&gt;pointeur_sur_l_objet_receveur&lt;/em&gt;, trivial
Par contre attardons nous sur la &lt;strong&gt;signature d'une méthode&lt;/strong&gt;&amp;nbsp;:
par exemple&amp;nbsp;:&lt;/p&gt;&lt;/blockquote&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; maclasse
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
       &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; ma_methode&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; argument1,&lt;span style=&quot;color: #0000ff;&quot;&gt;char&lt;/span&gt;* argument2&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;blockquote&gt;&lt;p&gt;la signature de  ma_methode est&amp;nbsp;: &lt;strong&gt;ma_methode (int,char*)&lt;/strong&gt;&lt;br /&gt;
Si on généralise une signature de méthode c'est&amp;nbsp;:
&lt;strong&gt;le_nom_de_la_methode ( le_type_de arg1,...,le_type_de_argN)&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vérifier que les signatures sont correctes&lt;/strong&gt; (ça s'appelle enfoncer le clou !)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;Donc on ne met &lt;strong&gt;pas le nom des arguments&lt;/strong&gt;, juste leur type&lt;/p&gt;&lt;/blockquote&gt;
&lt;pre class=&quot;cpp&quot;&gt;connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;a, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;mon_signal&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;&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;,b, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;mon_slot&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; argument&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;#41;&lt;/span&gt;;&lt;/pre&gt;

&lt;blockquote&gt;&lt;p&gt;Et on met encore moins de &lt;strong&gt;valeurs&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;pre class=&quot;cpp&quot;&gt;connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;a, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;mon_signal&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;42&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;,b, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;mon_slot&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;&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;#41;&lt;/span&gt;;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vérifier que la signature&lt;/strong&gt; de mon signal est la &lt;strong&gt;même&lt;/strong&gt; que celle de mon slot&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;C'est a dire que mon slot a les mêmes types d'arguments et le même nombre d'arguments que mon signal&lt;br /&gt;
&lt;strong&gt;note&lt;/strong&gt;: il est possible que le slot ait moins d'arguments que le signal, mais dans un soucis de clarté, ce doc  fait l'impasse la dessus&amp;nbsp;!&lt;/p&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vérifier qu'il n'y a pas faute&lt;/strong&gt; de copier/coller, de parenthèses ou de caractères en trop dans SIGNAL() et SLOT().&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;En effet SIGNAL() et SLOT() sont des macros qui, entres autres, convertissent leur contenu en chaine de caractère. Dans ce cas une erreur de syntaxe, ne provoque pas d'erreur à la compilation.&lt;/p&gt;&lt;/blockquote&gt;


&lt;h3&gt;Ca ne marche toujours pas&amp;nbsp;:&lt;/h3&gt;


&lt;p&gt;Alors une âme charitable pourra sûrement se pencher sur le problème (&lt;a href=&quot;http://forum.qtfr.org&quot; hreflang=&quot;fr&quot;&gt;forum&lt;/a&gt;)&lt;/p&gt;


&lt;h2&gt;Annexes&lt;/h2&gt;


&lt;h3&gt;Activer la console&lt;/h3&gt;


&lt;p&gt;La console est la sortie que Qt privilégie pour afficher ses messages d'erreurs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sous les systèmes un*x like, cette dernière est active par défaut, et pour visualiser les traces il suffit, d'exécuter son application depuis un shell ou se référer a la doc de son IDE afin de capturer la sortie standard.&lt;/li&gt;
&lt;li&gt;Sous les systèmes win32 il faut ajouter dans le fichier .pro du projet&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;CONFIG += console&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;


&lt;blockquote&gt;&lt;p&gt;puis recompiler l'application.&lt;/p&gt;
&lt;p&gt;
Les traces seront alors affichées dans une console ouverte en parallèle de l'application si celle-ci n'est pas lancée depuis la ligne de commande. Dans ce dernier cas, les traces sont affichées dans la console ayant servi à l'appel&lt;/p&gt;&lt;/blockquote&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Réseau avec Qt4</title>
    <link>http://doc.qtfr.org/post/2007/06/01/Reseau-avec-Qt4</link>
    <guid isPermaLink="false">urn:md5:03e6144a76a6712010e2ba373f2471b5</guid>
    <pubDate>Fri, 01 Jun 2007 22:36:00 +0200</pubDate>
    <dc:creator>Visiteur</dc:creator>
        <category>Tutoriels</category>
        <category>class_QFtp</category><category>class_QHttp</category><category>class_QTcpSocket</category><category>réseau</category><category>version_Qt4</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Comment utiliser les classes réseaux de Qt&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment faire un client/serveur TCP&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment faire un client FTP&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment faire un client HTTP&amp;nbsp;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce document présente différentes communications réseaux possibles en utilisant les classes de Qt&amp;nbsp;: TCP, FTP et HTTP.&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;: &lt;a href=&quot;http://forum.qtfr.org/profile.php?id=295&quot;&gt;rocsan&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;Le document est disponible en &lt;strong&gt;libre téléchargement en PDF&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://doc.qtfr.org/public/2007/reseau-avec-qt4.pdf&quot;&gt;téléchargez&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Il présente les différentes façons d'effectuer des communications réseaux avec Qt.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Création d’un client TCP&lt;/li&gt;
&lt;li&gt;Création d’un serveur TCP&lt;/li&gt;
&lt;li&gt;Création d’un client FTP&lt;/li&gt;
&lt;li&gt;Création d’un client HTTP&lt;/li&gt;
&lt;/ul&gt;</description>
    
          <enclosure url="http://doc.qtfr.org/public/2007/reseau-avec-qt4.pdf"
      length="371704" type="application/pdf" />
    
    
      </item>
    
  <item>
    <title>XML avec Qt4</title>
    <link>http://doc.qtfr.org/post/2007/05/17/XML-avec-Qt4</link>
    <guid isPermaLink="false">urn:md5:f02e91fb0d584fdc0a825d3561754765</guid>
    <pubDate>Sun, 27 May 2007 21:07:00 +0200</pubDate>
    <dc:creator>Visiteur</dc:creator>
        <category>Tutoriels</category>
        <category>class_QDomDocument</category><category>class_QDomElement</category><category>class_QXmlDefaultHandler</category><category>version_Qt4</category><category>xml</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Comment lire ou écrire un fichier XML&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment utiliser les méthodes DOM et SAX&amp;nbsp;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce document présente l'utilisation des méthodes &lt;a href=&quot;http://fr.wikipedia.org/wiki/Document_Object_Model&quot; hreflang=&quot;fr&quot;&gt;DOM&lt;/a&gt; et &lt;a href=&quot;http://fr.wikipedia.org/wiki/SAX&quot; hreflang=&quot;fr&quot;&gt;SAX&lt;/a&gt; avec Qt pour la lecture d'un fichier &lt;a href=&quot;http://fr.wikipedia.org/wiki/XML&quot; hreflang=&quot;fr&quot;&gt;XML&lt;/a&gt;.&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;: &lt;a href=&quot;http://forum.qtfr.org/profile.php?id=295&quot;&gt;rocsan&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;    &lt;p&gt;Le document est disponible en &lt;strong&gt;libre téléchargement en PDF&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://doc.qtfr.org/public/2007/xml-avec-qt4.pdf&quot;&gt;téléchargez&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Il détaille l'utilisation des méthodes DOM et SAX pour la lecture de fichier XML.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Présentation&lt;/li&gt;
&lt;li&gt;Ecriture d'un document XML avec la méthode DOM
&lt;ul&gt;
&lt;li&gt;Introduction à DOM&lt;/li&gt;
&lt;li&gt;Présentation de l'application&lt;/li&gt;
&lt;li&gt;Codage&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Lecture d'un document XML avec la méthode DOM
&lt;ul&gt;
&lt;li&gt;Présentation de l'application&lt;/li&gt;
&lt;li&gt;Codage&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Lecture d'un document XML avec la méthode SAX
&lt;ul&gt;
&lt;li&gt;Introduction à SAX&lt;/li&gt;
&lt;li&gt;Présentation de l'application&lt;/li&gt;
&lt;li&gt;Codage&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    
          <enclosure url="http://doc.qtfr.org/public/2007/xml-avec-qt4.pdf"
      length="307672" type="application/pdf" />
    
    
      </item>
    
  <item>
    <title>Environnement de développement pour Greenphone</title>
    <link>http://doc.qtfr.org/post/2007/04/22/Environnement-de-developpement-pour-Greenphone</link>
    <guid isPermaLink="false">urn:md5:dbb82f5c02c81db12310419adad040a7</guid>
    <pubDate>Fri, 27 Apr 2007 22:34:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Installation</category>
        <category>greenphone</category><category>installation</category><category>version-Qtopia4</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Comment développer une application pour Greenphone&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment installer l'environnement de développement pour Greenphone&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment se lancer dans la programmation pour Greenphone&amp;nbsp;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cet article va nous permettre d'installer un environnement de programmation afin d'écrire des programmes pour le &lt;a href=&quot;http://www.trolltech.com/products/qtopia/greenphone/index&quot; hreflang=&quot;en&quot;&gt;Greenphone&lt;/a&gt;. Il faut savoir qu&lt;em&gt;'il est tout à fait possible de développer une application sans avoir un Greenphone&lt;/em&gt;.&lt;/p&gt;


&lt;p&gt;L'installation et l'utilisation de cette environnement va vous permettre de tester vos applications pour Greenphone sans avoir à les transférer sur un Greenphone, et même de pouvoir tester l'envoie de SMS et de MMS.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Qtopia4 (SDK pour Greenphone) &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;/p&gt;    &lt;h3&gt;Installation&lt;/h3&gt;

&lt;p&gt;L'installation en elle-même est relativement simple, tout l'environnement de développement est disponible sur une image &lt;a href=&quot;http://fr.wikipedia.org/wiki/VMware&quot; hreflang=&quot;fr&quot;&gt;vmware&lt;/a&gt;&amp;nbsp;: l'environnement est exécuté dans une machine virtuelle.&lt;/p&gt;


&lt;p&gt;Il est par contre nécessaire d'installer le logiciel &lt;code&gt;VMWare player&lt;/code&gt;, qui est gratuit est disponible sur le &lt;a href=&quot;http://www.vmware.com/products/free_virtualization.html&quot;&gt;site de VMware&lt;/a&gt; ou sur certaines distributions Linux.&lt;/p&gt;



&lt;h4&gt;ISO de la SDK&lt;/h4&gt;

&lt;p&gt;L'image vmware n'est pas disponible directement en téléchargement, il faut récupérer une image ISO et la graver pour pouvoir effectuer l'installation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;télécharger l'image ISO sur le site de Qtopia&amp;nbsp;: &lt;a href=&quot;http://www.qtopia.net/modules/mydownloads/viewcat.php?cid=4&amp;amp;orderby=dateD&quot; hreflang=&quot;en&quot;&gt;page de téléchargement&lt;/a&gt;, choisissez la dernière disponible (actuellement&amp;nbsp;: &lt;em&gt;Greenphone Community SDK 4.2.1&lt;/em&gt;),&lt;/li&gt;
&lt;li&gt;graver l'image sur un CD.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&amp;nbsp;: la documentation est disponible sur le CD, sous le forme de fichier PDF (notamment &lt;code&gt;greenphone_quickstart.pdf&lt;/code&gt;).&lt;/p&gt;&lt;/blockquote&gt;



&lt;h4&gt;Installation de l'image vmware&lt;/h4&gt;

&lt;p&gt;L'image vmware est installable à partir du CD que vous venez de graver.&lt;/p&gt;


&lt;h5&gt;Sous Windows&lt;/h5&gt;

&lt;p&gt;Normalement, le programme d'installation se lance automatiquement. Si ce n'est pas le cas, allez sur le CD et lancer l'exécutable &lt;code&gt;autorun.exe&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;suivre les indications de l'installeur... normalement, pas de problème à cette étape.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;Sous Linux&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;aller sur le cdrom&amp;nbsp;: &lt;code&gt;cd /mnt/cdrom&lt;/code&gt; ou &lt;code&gt;cd /media/cdrom&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;lancer l'installation de l'image&amp;nbsp;: &lt;code&gt;sh install.sh&lt;/code&gt;, et suiver les instructions de l'installeur&lt;/li&gt;
&lt;li&gt;lancer l'image vmware en allant de le répertoire d'installation avec la commande suivante&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt; vmware greenphone.vmx&lt;/pre&gt;



&lt;h3&gt;Environnement de développement&lt;/h3&gt;

&lt;p&gt;Ca y est, vous avez installer l'environnement de développement&amp;nbsp;! Bravo&amp;nbsp;! Une fois lancé, vous avez un bureau KDE/Linux en 1024x768 (pour la petite histoire, c'est une &lt;a href=&quot;http://www.fr.debian.org/&quot; hreflang=&quot;en&quot;&gt;Debian Etch&lt;/a&gt; personnalisée)&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://doc.qtfr.org/public/2007/greenphone-env1.png&quot;&gt;&lt;img src=&quot;http://doc.qtfr.org/public/2007/.greenphone-env1_m.jpg&quot; alt=&quot;greenphone-env1.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Je vais maintenant détailler quelques personnalisation qui me semblent être indispensable pour développer correctement.&lt;/p&gt;



&lt;h4&gt;Utilisateurs&lt;/h4&gt;

&lt;p&gt;Deux utilisateurs sont prédéfinis&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;user&lt;/code&gt; (mot de passe &lt;code&gt;user&lt;/code&gt;)&amp;nbsp;: l'utilisateur sous lequel vous êtes connecté&lt;/li&gt;
&lt;li&gt;&lt;code&gt;root&lt;/code&gt; (mot de passe &lt;code&gt;root&lt;/code&gt;)&amp;nbsp;: l'administrateur&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Configuration du clavier&lt;/h4&gt;

&lt;p&gt;Première chose à faire, changer la configuration du clavier pour ceux qui ont un clavier azerty (vous l'avez peut-être remarqué, mais c'est configuré pour un clavier qwerty)&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aller dans le menu K (en bas à gauche) &amp;gt; Settings &amp;gt; Control Center&lt;/li&gt;
&lt;li&gt;aller dans Regional &amp;amp; Accessibility &amp;gt; Keyboard Layout&lt;/li&gt;
&lt;li&gt;modifier comme indiqué dans la capture d'écran suivante&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://doc.qtfr.org/public/2007/greenphone-env2.png&quot;&gt;&lt;img src=&quot;http://doc.qtfr.org/public/2007/.greenphone-env2_s.jpg&quot; alt=&quot;greenphone-env2.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h4&gt;Modification de la résolution&lt;/h4&gt;

&lt;p&gt;Je ne sais pas vous, mais moi j'ai la chance de ne pas avoir un écran 1024x768... il est donc nécessaire de modifier la résolution&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ouvrir une console (icône &lt;code&gt;Konsole&lt;/code&gt;) et taper les commandes suivantes (la deuxième commande va demander le mot de passe de l'utilisateur &lt;code&gt;root&lt;/code&gt;)&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
cd /etc/X11
sudo nano xorg.conf
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;modifier dans la section &quot;Screen&quot; la taille&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
    Subsection &amp;quot;Display&amp;quot;
        Depth       24
        Modes       &amp;quot;1024x768&amp;quot;
        ViewPort    0 0
    EndSubsection
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;redémarrer l'image vmware pour prendre les modifications en compte&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Installation de Subversion&lt;/h4&gt;

&lt;p&gt;Personnellement, je vois mal un environnement de développement sans un gestionnaire de versions, j'ai donc installer  &lt;a href=&quot;http://subversion.tigris.org/&quot; hreflang=&quot;en&quot;&gt;Subversion&lt;/a&gt;. Pour cela, ouvrez une console et tapez les lignes suivantes&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
sudo apt-get update
sudo apt-get install subversion
&lt;/pre&gt;


&lt;p&gt;La première ligne entraîne des erreurs chez moi, mais ce n'est pas grave, l'installation se passe bien au final.&lt;/p&gt;



&lt;h3&gt;Exécution du programme d'exemple&lt;/h3&gt;

&lt;p&gt;Afin de vérifier le bon fonctionnement, nous allons compiler et exécuter un programme d'exemple (qui est fourni dans le SDK)&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ouvrir une console (cliquez sur l'icône de la console)&lt;/li&gt;
&lt;li&gt;rentrer les commandes suivantes&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
source /opt/Qtopia/SDK/scripts/devel-x86.sh
cd ~/projects/application
qtopiamake
make clean
make
make install
gph -rescan
&lt;/pre&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&amp;nbsp;: lors de l'exécution de la dernière ligne, j'ai chez moi plusieurs erreurs (&lt;code&gt;QWSSocket::connectToLocalFile could not connect:: Connection refuse&lt;/code&gt;), mais ça ne semble pas gêner l'exécution du programme)&lt;/p&gt;&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;cliquer sur l'icône &lt;em&gt;runqpe&lt;/em&gt; pour lancer Qtopia dans &lt;acronym title=&quot;Qt/Embedded Virtual Framebuffer&quot;&gt;Qvfb&lt;/acronym&gt; avec le skin Greenphone&lt;/li&gt;
&lt;li&gt;naviguer dans le menu (&lt;em&gt;Applications-&amp;gt;Example&lt;/em&gt;) ou taper &lt;code&gt;./example&lt;/code&gt; dans la console pour lancer l'exemple&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://doc.qtfr.org/public/2007/greenphone-env3.png&quot;&gt;&lt;img src=&quot;http://doc.qtfr.org/public/2007/.greenphone-env3_s.jpg&quot; alt=&quot;greenphone-env3.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Amusez-vous bien avec le Greenphone&amp;nbsp;!&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Dessiner avec Qt4</title>
    <link>http://doc.qtfr.org/post/2007/04/24/Dessiner-avec-Qt4</link>
    <guid isPermaLink="false">urn:md5:a363bb36b598957e1235db27a9b40129</guid>
    <pubDate>Tue, 24 Apr 2007 11:02:00 +0200</pubDate>
    <dc:creator>Visiteur</dc:creator>
        <category>Documentation</category>
        <category>class_QPaintDevice</category><category>class_QPaintEngine</category><category>class_QPainter</category><category>dessin</category><category>version_Qt4</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Quelles sont les primitives de dessin de Qt4&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Où peut-on utiliser QPainter&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Quels sont les réglages et personnalisations possibles lors d'un dessin&amp;nbsp;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce document offre un excellent aide-mémoire pour tous ceux qui ont besoin d'utiliser le &lt;a href=&quot;http://doc.trolltech.com/4.3/paintsystem.html&quot; hreflang=&quot;en&quot;&gt;système de dessin de Qt&lt;/a&gt;. Basé sur la version 4.3, un grand nombre de fonctions et explications restent néanmoins valables pour des version inférieures de Qt (même Qt3).&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;: Véronique Lefrere&lt;/p&gt;    &lt;p&gt;Le document est disponible en &lt;strong&gt;libre téléchargement en PDF&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://doc.qtfr.org/public/2007/dessiner-avec-qt4.pdf&quot;&gt;téléchargez&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Il couvre tous les aspects du dessin (primitives, &lt;code&gt;QPainter&lt;/code&gt;, personnalisation...)&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dessiner quoi&amp;nbsp;?
&lt;ul&gt;
&lt;li&gt;Un (ou plusieurs) point(s) sur un plan donné&lt;/li&gt;
&lt;li&gt;Des segments&lt;/li&gt;
&lt;li&gt;Un polygone&lt;/li&gt;
&lt;li&gt;Un rectangle&lt;/li&gt;
&lt;li&gt;Un rectangles (angles arrondis)&lt;/li&gt;
&lt;li&gt;Une Ellipse&lt;/li&gt;
&lt;li&gt;Un Arc de cercle&lt;/li&gt;
&lt;li&gt;Une forme circulaire&lt;/li&gt;
&lt;li&gt;Une corde&lt;/li&gt;
&lt;li&gt;Un chemin&lt;/li&gt;
&lt;li&gt;Une région ou une zone&lt;/li&gt;
&lt;li&gt;Du texte&lt;/li&gt;
&lt;li&gt;Une pixmap ou une image&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Dessiner sur quoi?
&lt;ul&gt;
&lt;li&gt;Le support&lt;/li&gt;
&lt;li&gt;La region&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Dessiner comment&amp;nbsp;?
&lt;ul&gt;
&lt;li&gt;Les pré-réglages de dessin&lt;/li&gt;
&lt;li&gt;La transparence&lt;/li&gt;
&lt;li&gt;L’Anti-crènelage (anti-aliasing)&lt;/li&gt;
&lt;li&gt;Les lignes et contours&lt;/li&gt;
&lt;li&gt;Le remplissage&lt;/li&gt;
&lt;li&gt;Avec du style&lt;/li&gt;
&lt;li&gt;Du texte haut en couleur&lt;/li&gt;
&lt;li&gt;Le Système de coordonnées&lt;/li&gt;
&lt;li&gt;La Conversion des coordonnées logiques en coordonnées physiques (et inversement)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    
          <enclosure url="http://doc.qtfr.org/public/2007/dessiner-avec-qt4.pdf"
      length="342258" type="application/pdf" />
    
    
      </item>
    
  <item>
    <title>Ouverture d'une boîte de dialogue à partir de la fenêtre principale</title>
    <link>http://doc.qtfr.org/post/2007/04/10/Ouverture-dune-fenetre-a-partir-de-la-fenetre-principale</link>
    <guid isPermaLink="false">urn:md5:a00ab0041f9ff6004a286a94edc362e4</guid>
    <pubDate>Sun, 15 Apr 2007 18:24:00 +0200</pubDate>
    <dc:creator>IrmatDen</dc:creator>
        <category>Tutoriels</category>
        <category>class_QAction</category><category>class_QDialog</category><category>class_QMenu</category><category>class_QMessageBox</category><category>signaux-slots</category><category>version_Qt4</category>    
    <description>&lt;p&gt;Ce tutoriel est destiné aux nouveaux venus à Qt qui cherche à savoir comment ouvrir une fenêtre à partir de leur fenêtre principale. Nous verrons 2 façons de faire:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;utilisation d'une fenêtre principale avec menus pour ouvrir une boîte de dialogue et une boite &quot;A propos...&quot;&lt;/li&gt;
&lt;li&gt;ouverture d'une fenêtre de dialogue par le biais d'un bouton&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;J'en profiterais pour aborder très brièvement 2 autres points&amp;nbsp;: l'utilisation de &lt;code&gt;QAction&lt;/code&gt; et les 2 modes d'affichage des boîtes de dialogue.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Qt4 (et une version pyQt disponible)&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;a href=&quot;http://doc.qtfr.org/post/2007/04/10/[http://forum.qtfr.org/profile.php?id=2344&quot;&gt;alteo_gange&lt;/a&gt; pour la version pyQt&lt;br /&gt;
&lt;strong&gt;Fil de discussion&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://forum.qtfr.org/viewtopic.php?pid=31512&quot;&gt;Forum&lt;/a&gt;&lt;/p&gt;    &lt;h2&gt;Pré requis:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;une installation de Qt4 fonctionnelle&lt;/li&gt;
&lt;li&gt;une connaissance minimale du principe des signaux/slots avec Qt&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Une introduction aux boîtes de dialogue&lt;/h2&gt;


&lt;p&gt;Les boîtes de dialogue sont des composants essentiel à la très grosse majorité des applications. Qu'il s'agisse de boîte de configuration ou de fournir une interactivité à un niveau plus ou moins bas avec le document ouvert (par exemple, la recherche dans un traitement de texte ou un tableur), vous aurez souvent l'occasion d'en utiliser.&lt;/p&gt;


&lt;p&gt;On distingue 2 types d'utilisation des boîtes de dialogue:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;non modale: l'utilisateur peut continuer d'interagir avec le reste de l'application&lt;/li&gt;
&lt;li&gt;modale: l'utilisateur est obligé de fermer la boîte de dialogue affichée avant de pouvoir à nouveau se servir de l'application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chaque usage à son but; par exemple, une boîte de dialogue permettant une recherche dans un document aura tout intérêt à être non modale par souci d'ergonomie. Par contre, une fenêtre de configuration devrait plutôt être modale, dûe à une éventuelle dépendance du résultat sur le comportement de l'application.&lt;/p&gt;


&lt;h2&gt;A propos de ce tuto&lt;/h2&gt;


&lt;p&gt;Ce tuto vous permettra, je l'espère de vous familiariser avec &lt;code&gt;QDialog&lt;/code&gt; principalement, et plus globalement l'ouverture de fenêtre à partir d'une autre. Je fourni ici 2 approches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la première est l'ouverture d'une fenêtre en appuyant sur un bouton: elle est la méthode la plus simple, mais pas forcèment la plus commune&lt;/li&gt;
&lt;li&gt;la seconde fait utilisation d'un menu, et vous montre comment afficher une boîte de type &quot;A propos...&quot;. Il y est fait appel à 2 concepts supplémentaires: les menus et les actions. Le code est loin d'être compliqué, mais assurez-vous d'avoir compris la première partie pour lire la seconde.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comme dit dans l'introduction, une version pyQt a été réalisée par &lt;a href=&quot;http://doc.qtfr.org/post/2007/04/10/[http://forum.qtfr.org/profile.php?id=2344&quot;&gt;alteo_gange&lt;/a&gt;. Elle est disponible sur le &lt;a href=&quot;http://forum.qtfr.org/viewtopic.php?pid=32334#p32334&quot;&gt;forum&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;Partie 0: Lectrice/Lecteur, voici &lt;a href=&quot;http://doc.trolltech.com/4.2/qdialog.html&quot; hreflang=&quot;en&quot;&gt;QDialog&lt;/a&gt;; QDialog, voici ton futur maître ;-)&lt;/h2&gt;


&lt;p&gt;Avant de sauter dans le vif du sujet, faisons plus ample connaissance avec la classe &lt;code&gt;QDialog&lt;/code&gt;. Vous vous en doutez probablement, elle réalise ce qu'une boîte de dialogue est sensée faire, et permet quelques raccourcis que vous n'auriez pas si vous dériviez d'un &lt;code&gt;QWidget&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Cette section sert de très brève introduction aux fonctions les plus basiques de &lt;code&gt;QDialog&lt;/code&gt;. Je vous invite à aller lire la &lt;a href=&quot;http://doc.trolltech.com/4.2/qdialog.html#details&quot; hreflang=&quot;en&quot;&gt;description&lt;/a&gt; détaillée sur la page de documentation de Trolltech. Ils en parlent bien mieux que moi.&lt;/p&gt;


&lt;h3&gt;De la modalité et différences entre les fonctions d'affichage&lt;/h3&gt;


&lt;p&gt;Afficher une instance de &lt;code&gt;QDialog&lt;/code&gt; peut se faire de plusieurs façons. En voici un aperçu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;QDialog::show()&lt;/code&gt;: QDialog::show(): utilisé pour un affichage de la boîte de dialogue; par défaut l'affichage est non modal; peut servir à afficher un &lt;code&gt;QDialog&lt;/code&gt; de façon modale si &lt;code&gt;setModal(true)&lt;/code&gt; à été appellé précédemment.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QDialog::hide()&lt;/code&gt;: permet de cacher une boite de dialogue&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QWidget::setVisible()&lt;/code&gt; et &lt;code&gt;QWidget::isVisible()&lt;/code&gt;: &lt;code&gt;QDialog&lt;/code&gt; dérive de &lt;code&gt;QWidget&lt;/code&gt;, et fournit donc cette alternative à &lt;code&gt;show()/hide()&lt;/code&gt;. L'utilité de ces fonctions se trouve principalement dans la possibilité de changer la visibilité d'une fenêtre en une ligne de code.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QDialog::exec()&lt;/code&gt;: sert à afficher une boite de dialogue modale et éventuellement récupérer le code de retour&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Valeurs de retours&lt;/h3&gt;


&lt;p&gt;Il peut être parfois utile de savoir si l'interaction demandée à l'utilisateur par le biais de votre boîte de dialogue à réussi ou échoué (dans le cas d'une boîte modale).
&lt;code&gt;QDialog::exec()&lt;/code&gt; renvoit un code d'erreur qui est soit &lt;code&gt;QDialog::Accepted&lt;/code&gt;, soit &lt;code&gt;QDialog::Rejected&lt;/code&gt; (ou encore une de vos valeurs propres dans des cas peu courants). La première valeur signifie un succès, tandis que la seconde indique soit un échec, soit un refus ou une annulation.
Du côté de votre boîte de dialogue, vous pouvez renvoyer ces valeurs de diverses façons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;QDialog::accept()&lt;/code&gt;: &lt;code&gt;QDialog::Accepted&lt;/code&gt; sera la valeur renvoyée par &lt;code&gt;exec()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QDialog::reject()&lt;/code&gt;: &lt;code&gt;QDialog::Rejected&lt;/code&gt; sera renvoyée&lt;/li&gt;
&lt;li&gt;&lt;code&gt;QDialog::done(int)&lt;/code&gt;: vous permet de spécifier l'une des 2 valeurs, mais aussi de spécifier la votre si vous en avez un réél besoin (utilisation assez rare tout de même).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Une boîte de dialogue...&lt;/h3&gt;


&lt;p&gt;La classe définie ici sera celle que nous allons afficher dans les 2 exemples suivant. Elle n'est composée que d'un bouton &quot;Fermer&quot;.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; Dialog : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QDialog
&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;:
	Dialog&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QWidget *parent=&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
	:QDialog&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;parent&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: #ff0000;&quot;&gt;// Elle est simplement composé d'un bouton &amp;quot;Fermer&amp;quot;&lt;/span&gt;
		QPushButton *closeBtn = &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; QPushButton&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;Fermer&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
		&lt;span style=&quot;color: #ff0000;&quot;&gt;// lequel ferme la fenetre lorsqu'on clic dessus&lt;/span&gt;
		connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;closeBtn, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;clicked&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;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;accept&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;&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;/pre&gt;


&lt;h2&gt;Partie 1: ouverture de fenêtre avec des boutons&lt;/h2&gt;

&lt;h3&gt;Classes abordées:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.trolltech.com/4.2/qdialog.html&quot; hreflang=&quot;en&quot;&gt;QDialog&lt;/a&gt;: sert de classe de base aux boîtes de dialogue&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.trolltech.com/4.2/qpushbutton.html&quot; hreflang=&quot;en&quot;&gt;QPushButton&lt;/a&gt;: déclenche l'affichage des boites de dialogue, et quitte l'application&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Description de la solution&lt;/h3&gt;


&lt;p&gt;Bien que rarement utilisée/utilisable à cause du &quot;clicodrome&quot; qui risque d'être engendré (affichage d'une boîte de dialogue qui en appelle une autre qui... :)), cette méthode permet d'illustrer simplement l'ouverture d'une boîte de dialogue. Ceci dit, il peut toujours y avoir besoin d'une telle utilisation, ne serait-ce que parce que votre widget principal ne possède pas de menu.&lt;/p&gt;


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


&lt;p&gt;Voici la classe principale. C'est à partir de celle-ci que nous allons demander l'ouverture d'une instance de &lt;code&gt;Dialog&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; MainDialog : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QDialog
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
	Q_OBJECT
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:
	MainDialog&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QWidget *parent=&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
	:QDialog&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;parent&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, dlg&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;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;
		dlg = &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; Dialog&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
		&lt;span style=&quot;color: #ff0000;&quot;&gt;// Ce bouton nous permettra d'afficher notre boîte de dialogue&lt;/span&gt;
		QPushButton *modalDlgBtn = &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; QPushButton&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot; Open Modal dialog&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
		&lt;span style=&quot;color: #ff0000;&quot;&gt;// J'agrandis la fenetre pour que dlg soit visuellement différenciable de celle-ci&lt;/span&gt;
		resize&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;250&lt;/span&gt;,&lt;span style=&quot;color: #0000dd;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
		&lt;span style=&quot;color: #ff0000;&quot;&gt;// On demande à Qt d'executer showDialogModal() lorsque le bouton est clique&lt;/span&gt;
		connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;modalDlgBtn, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;clicked&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;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;showDialogModal&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;&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;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; slots:
	&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; showDialogModal&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: #ff0000;&quot;&gt;// on affiche la boite de dialogue de facon modale&lt;/span&gt;
		dlg-&amp;gt;setModal&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
		dlg-&amp;gt;show&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;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:
	Dialog *dlg;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;


&lt;h2&gt;Partie 2: utilisation d'une fenêtre principale avec menus pour ouvrir une boîte de dialogue et une boite &quot;A propos...&quot;&lt;/h2&gt;

&lt;h3&gt;Classes abordées:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.trolltech.com/4.2/qmainwindow.html&quot; hreflang=&quot;en&quot;&gt;QMainWindow&lt;/a&gt;: nous en dériverons pour créer une fenêtre principale avec barre de menu&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.trolltech.com/4.2/qdialog.html&quot; hreflang=&quot;en&quot;&gt;QDialog&lt;/a&gt;: sert de classe de base à notre boîte de dialogue&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.trolltech.com/4.2/qmessagebox.html&quot; hreflang=&quot;en&quot;&gt;QMessageBox&lt;/a&gt;: affichage d'un message &quot;A propos...&quot;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.trolltech.com/4.2/qaction.html&quot; hreflang=&quot;en&quot;&gt;QAction&lt;/a&gt;: permet de centraliser et coordonner le comportement et l'apparence entre des choix de menus ou des boutons sur une barre d'outils (chose que nous ne verrons pas ici)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Description de la solution&lt;/h3&gt;


&lt;p&gt;Nous allons utiliser ici un menu pour permettre d'ouvrir une boîte de dialogue de façon modale, non modale, et enfin une descrption de ce petit code. La classe &lt;code&gt;QAction&lt;/code&gt; permet d'ajouter des fonctionnalités à un menu, ainsi qu'à d'éventuelles barre d'outils.&lt;/p&gt;


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


&lt;p&gt;C'est à partir de l'interface décrite ci-dessous que nous allons demander l'ouverture d'une instance de &lt;code&gt;Dialog&lt;/code&gt;, que ce soit de façon modale ou non.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; MainWindow : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QMainWindow
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
Q_OBJECT
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:
	MainWindow&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QWidget *parent=&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
	:QMainWindow&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;parent&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, dlg&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;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: #ff0000;&quot;&gt;// Nous creons l'instance de dialogue que nous voulons afficher&lt;/span&gt;
		dlg = &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; Dialog&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
		&lt;span style=&quot;color: #ff0000;&quot;&gt;// Les actions correspondront aux items de menus&lt;/span&gt;
		QAction *modelessAct = &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; QAction&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;Dialogue non modale&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
		QAction *modalAct = &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; QAction&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;Afficher dialogue modale&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
		QAction *aboutAct = &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; QAction&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;A propos...&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
		QAction *closeAct = &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; QAction&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;Quitter&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
		&lt;span style=&quot;color: #ff0000;&quot;&gt;// Nous créons le menu proprement dit. Nous y ajoutons les actions précédemment crées&lt;/span&gt;
		QMenu *menu = menuBar&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;gt;addMenu&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;Divers...&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
		menu-&amp;gt;addAction&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;modelessAct&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
		menu-&amp;gt;addAction&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;modalAct&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
		menu-&amp;gt;addAction&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;aboutAct&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
		menu-&amp;gt;addAction&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;closeAct&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
		&lt;span style=&quot;color: #ff0000;&quot;&gt;// Définition des comportements des actions&lt;/span&gt;
		connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;modelessAct, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;triggered&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;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;swapShowDialogModeless&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;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
		connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;modalAct, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;triggered&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;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;showDialogModal&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;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
		connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;aboutAct, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;triggered&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;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;about&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;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
		connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;closeAct, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;triggered&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;, qApp, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;quit&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;&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;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; slots:
	&lt;span style=&quot;color: #ff0000;&quot;&gt;// Affichée de façon modeless, l'utilisateur peut continuer d'interagir avec le reste de l'application&lt;/span&gt;
	&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; swapShowDialogModeless&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: #ff0000;&quot;&gt;// Si elle est deja affichee, on cache la boite de dialogue sinon on l'affiche&lt;/span&gt;
		dlg-&amp;gt;setVisible&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;!dlg-&amp;gt;isVisible&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;;
	&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;// En version modale, une boite de dialogue empêche l'utilisateur d'intervenir sur une autre partie&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;// de l'interface que la boite de dialogue&lt;/span&gt;
	&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; showDialogModal&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: #ff0000;&quot;&gt;// On s'assure que notre boite de dialogue n'est pas déjà affichée de façon non modale&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;dlg-&amp;gt;isVisible&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;
		&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
			QMessageBox::&lt;span style=&quot;color: #00eeff;&quot;&gt;critical&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;, &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;Erreur&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;La boite de dialogue est déjà ouverte. Veuillez la fermer pour l'ouvrir à nouveau.&amp;quot;&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: #0000ff;&quot;&gt;else&lt;/span&gt;
		&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
			dlg-&amp;gt;exec&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;
&amp;nbsp;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;// Affichage d'information à propos de ce &amp;quot;logiciel&amp;quot;&lt;/span&gt;
	&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; about&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;
		QMessageBox::&lt;span style=&quot;color: #00eeff;&quot;&gt;about&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;, &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;Tuto: Menus et dialogues&amp;quot;&lt;/span&gt;,
			&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;Cette application est destinée à illustrer:&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt; \
			&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;gt; l'ouverture de boîte de dialogue&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt; \
			&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;gt; l'ouverture d'une fenetre &lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\&amp;quot;&lt;/span&gt;A propos...&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt; \
			&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;gt; et une rapide introduction à QAction&amp;quot;&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;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:
	Dialog *dlg;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;


&lt;h2&gt;Archive&lt;/h2&gt;


&lt;p&gt;Vous trouverez attaché à cette article une archive composée de 2 sous répertoires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;bouton: exemple de la première partie&lt;/li&gt;
&lt;li&gt;menu: exemple de la seconde&lt;/li&gt;
&lt;/ul&gt;</description>
    
          <enclosure url="http://doc.qtfr.org/public/2007/dialog_from_window.zip"
      length="3117" type="application/zip" />
    
    
      </item>
    
  <item>
    <title>Cross Compilation Native d'application Qt depuis Linux/Unix Like</title>
    <link>http://doc.qtfr.org/post/2007/04/10/Cross-Compilation-Native-dapplication-Qt-depuis-Linux</link>
    <guid isPermaLink="false">urn:md5:9fc40305e2bec2c5a8e6026f8ffa58fd</guid>
    <pubDate>Sat, 14 Apr 2007 10:01:00 +0200</pubDate>
    <dc:creator>P@sNox</dc:creator>
        <category>Installation</category>
        <category>cross-compilation</category><category>installation</category><category>Linux</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Qu'est ce que la cross compilation&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment créer un executable pour une architecture différente&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment créer un exécutable Windows sous Linux&amp;nbsp;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un compilateur croisé (en anglais &lt;a href=&quot;http://fr.wikipedia.org/wiki/Compilateur&quot; hreflang=&quot;fr&quot;&gt;cross compiler&lt;/a&gt;.) est un programme capable de traduire un code source en code objet ayant un environnement d'exécution (architecture matérielle, système d'exploitation) différent de celui où la compilation est effectuée. Ces compilateurs sont principalement utilisés en informatique industrielle.&lt;/p&gt;


&lt;p&gt;Cet article va detailler la mise en place et l'utilisation d'un environnement de compilation multi plateforme.
En effet, tout le monde n'a pas Windows dans sa poche ( et heureusement :D ), et fournir un executable pour une architecture autre que la sienne peut parfois etre un vrai calvaire.&lt;br /&gt;
Aussi à travers de ce tutoriel, nous allons mettre un place un tel systeme en utilisant mingw32 et Qt4.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Qt4 (supérieur ou égal à Qt 4.0, peut etre valable pour n'importe quelle autre librairie) &lt;br /&gt;
&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: Filipe Azevedo (&lt;a href=&quot;http://forum.qtfr.org/profile.php?id=352&quot;&gt;pasnox&lt;/a&gt;)&lt;br /&gt;
&lt;strong&gt;Test&lt;/strong&gt;&amp;nbsp;: Kubuntu Feisty 7.04 beta (Qt 4.2.3)&lt;/p&gt;    &lt;h3&gt;Pré-requis&lt;/h3&gt;


&lt;p&gt;Le but de ce tutoriel est de montrer comment compiler une application Qt 4 pour Windows depuis Linux.
Nous aurons donc besoin d'installer les logiciels suivant&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mingw32 (disponible normalement dans les paquets de votre distribution, il aura pour effet d'installer en plus les paquets suivant&amp;nbsp;: &lt;code&gt;mingw32-binutils&lt;/code&gt; et &lt;code&gt;mingw32-runtime&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Wine (pour ensuite tester votre application Windows sous Linux)&lt;/li&gt;
&lt;li&gt;Une installation correcte de Qt 4 pour Windows version mingw&lt;/li&gt;
&lt;li&gt;Une installation correcte de Qt 4 pour Linux&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Installation des paquets (système basé sur debian)&lt;/h3&gt;


&lt;p&gt;La façon la plus simple d'installer mingw32 et Wine est d'ouvrir une console (ou bien un gestionnaire de paquet, tel &lt;em&gt;Adept&lt;/em&gt;) et d'y inscrire les commandes suivante&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
pasnox@pasnox-desktop:~$ sudo apt-get install mingw32
pasnox@pasnox-desktop:~$ sudo apt-get install wine
&lt;/pre&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&amp;nbsp;: les commandes d'installation de paquet ci contre ne sont valables que pour debian/ubuntu/kubuntu, ou tout systeme basé sur debian, veuillez vous réferrer à la documentation de votre distribution linux le cas échéant.&lt;/p&gt;&lt;/blockquote&gt;



&lt;h3&gt;Installation de Qt 4 Windows&lt;/h3&gt;


&lt;p&gt;Maintenant que nous avons installé Wine, nous pouvons installer la &lt;a href=&quot;http://www.trolltech.com/developer/downloads/qt/windows&quot; hreflang=&quot;en&quot;&gt;version Windows de Qt 4&lt;/a&gt; qui utilise mingw (par exemple la version &lt;a href=&quot;http://www.trolltech.com/download?target=ftp://ftp.trolltech.com/qt/source/qt-win-opensource-4.2.3-mingw.exe&quot; hreflang=&quot;en&quot;&gt;4.2.3&lt;/a&gt;)
Une fois téléchargé, pour l'installer, veuillez ouvrir une console et taper&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
pasnox@pasnox-desktop:~$ wine chemin/de/qt/pour/windows/qt-win-opensource-4.2.3-mingw.exe
&lt;/pre&gt;


&lt;p&gt;Je vous conseille d'installer la librairie Qt dans un dossier dont le chemin ne contient pas d'espace, par exemple&amp;nbsp;: &lt;strong&gt;C:\Development\Qt\4.2.3&lt;/strong&gt; (chemin qui sera utilisé par la suite).&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt;&amp;nbsp;: il n'est pas nécessaire d'installer mingw depuis l'installateur, même si celui-ci vous dit qu'il ne le trouve pas.&lt;/p&gt;&lt;/blockquote&gt;



&lt;h3&gt;Configuration de Wine&lt;/h3&gt;


&lt;p&gt;Maintenant que Qt 4 pour Windows est installé, il faut indiquer à Wine où trouver les librairies Qt.
Il s'agit en fait de modifier la base de registres, car les variables d'environnement ne sont pas accessibles.
Pour ce faire, exécuter le logiciel &lt;em&gt;Wine RegEdit&lt;/em&gt;.&lt;/p&gt;

&lt;pre&gt;
pasnox@pasnox-desktop:~$ wine regedit
&lt;/pre&gt;


&lt;p&gt;Rendez-vous dans la clé &lt;code&gt;&lt;strong&gt;HKEY_CURRENT_USER&lt;/strong&gt;&lt;/code&gt;.
Si la clé &lt;code&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/code&gt; n'existe pas, veuillez la créer en faisant clique droit sur la clé &lt;code&gt;&lt;strong&gt;HKEY_CURRENT_USER&lt;/strong&gt;&lt;/code&gt;, puis nouvelle clé.&lt;br /&gt;
Dans cette clé ( &lt;code&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/code&gt; ), la valeur nommé &lt;code&gt;&lt;strong&gt;PATH&lt;/strong&gt;&lt;/code&gt; devrait s'y trouver .
Si celle-ci n'existe pas créez là&amp;nbsp;: clique droit sur la clé &lt;code&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/code&gt; puis nouvelle valeur chaine.&lt;br /&gt;
Nommez-la &lt;code&gt;&lt;strong&gt;PATH&lt;/strong&gt;&lt;/code&gt; et donnez lui la valeur du chemin d'installation des exécutables de Qt, c'est à dire &lt;code&gt;&lt;strong&gt;C:\Development\Qt\4.2.3\bin&lt;/strong&gt;&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://doc.qtfr.org/public/2007/wine_regedit.png&quot;&gt;&lt;img src=&quot;http://doc.qtfr.org/public/2007/.wine_regedit_s.jpg&quot; alt=&quot;Wine RegEdit&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Parfait, il manque maintenant une dll, celle-ci se nomme &lt;code&gt;&lt;strong&gt;mingwm10.dll&lt;/strong&gt;&lt;/code&gt; et est disponible depuis les paquets installés. Pour ne pas être embêté, nous allons la copier dans le dossier &lt;code&gt;&lt;strong&gt;system32&lt;/strong&gt;&lt;/code&gt; de Wine, ce qui permettra d'executer des applications mingw depuis Wine plus facilement.&lt;/p&gt;


&lt;p&gt;Ouvrez une console et tapez&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
pasnox@pasnox-desktop:~$ gunzip -c /usr/share/doc/mingw32-runtime/mingwm10.dll.gz &amp;gt; ~/.wine/drive_c/windows/system32/mingwm10.dll
&lt;/pre&gt;


&lt;p&gt;Vous disposez maintenant d'une version de Wine prête pour l'exécution d'application Qt 4.&lt;/p&gt;



&lt;h3&gt;Création d'un mkspec&lt;/h3&gt;


&lt;p&gt;Pour pouvoir compiler notre application, il va nous falloir créer un nouveau mkspec basé sur celui de &lt;em&gt;win32-g++&lt;/em&gt;.
Copiez donc le contenu grâce à la commande suivante (&lt;code&gt;/usr/share/qt4&lt;/code&gt; est le répertoire d'installation par défaut des paquets Qt4 sous distribution à base de Debian)&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
pasnox@pasnox-desktop:~$ sudo cp -r /usr/share/qt4/mkspecs/win32-g++ /usr/share/qt4/mkspecs/win32-x-g++
&lt;/pre&gt;


&lt;p&gt;On a donc maintenant un nouveau mkspec nommé &lt;strong&gt;win32-x-g++&lt;/strong&gt; basé sur &lt;em&gt;win32-g++&lt;/em&gt;.
Il faut remplacer quelques variables contenues dans le fichier &lt;code&gt;&lt;strong&gt;qmake.conf&lt;/strong&gt;&lt;/code&gt; de ce nouveau mkspec, toujours dans la console tapez&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
pasnox@pasnox-desktop:~$ sudo kate /usr/share/qt4/mkspecs/win32-x-g++/qmake.conf
&lt;/pre&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&amp;nbsp;: Vous pouvez utiliser autre chose que &lt;strong&gt;kate&lt;/strong&gt; comme éditeur de texte.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Les variables à remplacer sont en fait les compilateurs  C et C&lt;code&gt;++&lt;/code&gt; ( gcc et g++ ) ainsi que les commandes DOS.&lt;/p&gt;


&lt;p&gt;Voici les variables a modifier&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
QMAKE_CC		= i586-mingw32msvc-gcc
QMAKE_CXX		= i586-mingw32msvc-g++
QMAKE_INCDIR		= /usr/i586-mingw32msvc/include
QMAKE_INCDIR_QT		= ~/.wine/drive_c/Development/Qt/4.2.3/include
QMAKE_LIBDIR_QT		= ~/.wine/drive_c/Development/Qt/4.2.3/lib
QMAKE_LINK		= i586-mingw32msvc-g++
# N'oubliez pas le -mwindows a la fin pour éviter d'avoir une console dans vos applications
QMAKE_LFLAGS		= -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mwindows
# les commande DOS sont à remplacer par les commandes shell unix
#isEqual(MINGW_IN_SHELL, 1) {
	QMAKE_DIR_SEP		= /
	QMAKE_COPY		= cp
	QMAKE_COPY_DIR		= cp -r
	QMAKE_MOVE		= mv
	QMAKE_DEL_FILE		= rm -f
	QMAKE_MKDIR		= mkdir -p
	QMAKE_DEL_DIR		= rm -rf
#} else {
# Vous pouvez effacer la partie else qui ne sert a rien, ainsi que le isEqual du dessus
#}
# Enlever les .exe des executables
QMAKE_MOC               = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc
QMAKE_UIC               = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic
QMAKE_IDC               = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc
QMAKE_RCC               = $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}rcc
QMAKE_LIB		= i586-mingw32-ar -ru
QMAKE_RC                = i586-mingw32msvc-windres
QMAKE_STRIP             = i586-mingw32msvc-strip
&lt;/pre&gt;


&lt;p&gt;Une fois terminée, vous êtes enfin prêt à compiler votre application pour windows :)&lt;/p&gt;


&lt;p&gt;Pour ce faire vous utiliserez le mkspec &lt;strong&gt;win32-x-g++&lt;/strong&gt; lors de l'apelle à &lt;em&gt;qmake&lt;/em&gt;&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
pasnox@pasnox-desktop:~$ qmake-qt4 -spec win32-x-g++ &amp;amp;&amp;amp; make
&lt;/pre&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&amp;nbsp;: Il semblerait que sous mac, il faille ajouter la platforme à la ligne de commande qmake&amp;nbsp;: &lt;strong&gt;-win32&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Une fois compilée, l'application se trouve dans le dossier &lt;code&gt;release&lt;/code&gt; en cas de compilation release, ou bien dans le dossier &lt;code&gt;debug&lt;/code&gt; ( vous aurez besoin de compiler Qt en debug pour cela )&lt;/p&gt;


&lt;p&gt;Pour lancer l'application grace à Wine&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
pasnox@pasnox-desktop:~$ wine release/mon_application.exe
&lt;/pre&gt;


&lt;p&gt;Il est à noter que le binaire aura besoin, tout comme une compilation via mingw32 sous Windows, des dll Qt (au minimum de QtCore pour une application console, et QtCore/QtGui pour une application graphique simple) ainsi que de &lt;code&gt;mingwm10.dll&lt;/code&gt;.&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&amp;nbsp;: Pour supprimer la dépendance aux dlls de Qt, il est nécessaire de compiler Qt4 Windows en version statique, mais c'est un problème qui n'est pas traité ici... peut-être plus tard.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Bonne cross compilation&amp;nbsp;!&lt;/p&gt;


&lt;h3&gt;Autres sources&lt;/h3&gt;

&lt;p&gt;Vous trouverez ici d'autres informations sur la cross-compilation ici&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://forum.qtfr.org/viewtopic.php?id=2007&quot; hreflang=&quot;fr&quot;&gt;Cross-compilation C++/QT4&lt;/a&gt; sur le forum, par &lt;a href=&quot;http://forum.qtfr.org/profile.php?id=907&quot;&gt;Amalsek&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.dumbbell.fr/howto/win32-cross-compilation.fr.html&quot; hreflang=&quot;fr&quot;&gt;Cross-compilation vers un environnement Win32&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://silmor.de/29&quot; hreflang=&quot;en&quot;&gt;Cross compiling Qt/Win Apps on Linux&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Utilisation du designer avec Qt4</title>
    <link>http://doc.qtfr.org/post/2007/04/01/Utilisation-du-designer</link>
    <guid isPermaLink="false">urn:md5:aa23d5c8b879d74148beac07811eecf6</guid>
    <pubDate>Wed, 04 Apr 2007 21:33:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Documentation</category>
        <category>designer</category><category>signaux-slots</category><category>version_Qt4</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Comment intégrer un widget créé avec le designer&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment utiliser les fichiers .ui créés par le designer&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Quelle est la différence entre les trois méthodes d'intégration?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cet article va détailler l'utilisation du designer et l'intégration d'un widget créé avec le designer dans notre programme. Cet article est une &lt;em&gt;adaptation libre&lt;/em&gt; de la documentation de Qt&amp;nbsp;: &lt;a href=&quot;http://doc.trolltech.com/4.2/designer-using-a-component.html&quot; hreflang=&quot;en&quot;&gt;Using a Component in Your Application&lt;/a&gt;.&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.2)&lt;/p&gt;    &lt;h3&gt;Introduction&lt;/h3&gt;


&lt;p&gt;Depuis Qt4, le designer a repris sa fonction première&amp;nbsp;: la création &lt;acronym title=&quot;What You See Is What You Get&quot;&gt;WYSIWYG&lt;/acronym&gt; de &lt;em&gt;forms&lt;/em&gt;(terme générique pour désigner soit une fenêtre principale, soit une boîte de dialogue, soit un widget personnalisé). L'utilisation du designer en lui-même et les différences entre ces &lt;em&gt;forms&lt;/em&gt; ne seront pas abordés ici.&lt;/p&gt;


&lt;p&gt;Une fois que l'utilisateur a créé une &lt;em&gt;form&lt;/em&gt; et l'enregistre sur le disque, il crée un fichier &lt;code&gt;.ui&lt;/code&gt; qui n'est autre qu'un fichier XML décrivant la &lt;em&gt;form&lt;/em&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;widgets qui composent la &lt;em&gt;form&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;organisation (layout) et position des différents widgets&lt;/li&gt;
&lt;li&gt;connexions entre les différents widgets&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce fichier &lt;code&gt;.ui&lt;/code&gt; n'est pas directement compilable&amp;nbsp;: pour être utilisé, il doit être converti en fichier C++ à l'aide de l'outil &lt;code&gt;uic&lt;/code&gt;. Avec l'utilisation combinée de &lt;code&gt;uic&lt;/code&gt; et de &lt;code&gt;qmake&lt;/code&gt;, le code C++ est généré automatiquement lors de la compilation de l'application.&lt;/p&gt;


&lt;p&gt;Il existe trois méthodes différentes pour intégrer les &lt;em&gt;forms&lt;/em&gt; créées avec le designer. Pour l'exemple, vous pouvez utiliser n'importe quelle &lt;em&gt;form&lt;/em&gt;, vous en trouverez une en annexe de cet article (qui s'appelle &lt;code&gt;mywidget.ui&lt;/code&gt;)&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://doc.qtfr.org/public/2007/designer-exemple.png&quot; alt=&quot;designer-exemple.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;h4&gt;Fichier généré&lt;/h4&gt;

&lt;p&gt;Le fichier généré par &lt;code&gt;uic&lt;/code&gt; n'est pas un &lt;code&gt;QWidget&lt;/code&gt; (ou &lt;code&gt;QMainApplication&lt;/code&gt;/&lt;code&gt;QDialog&lt;/code&gt;), mais c'est juste une classe de description de l'interface contenant le code de création et d'organisation des widgets, ainsi que les connexions définies dans le designer.&lt;/p&gt;


&lt;p&gt;Par exemple, à partir du fichier &lt;code&gt;mywidget.ui&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un fichier &lt;code&gt;ui_mywidget.h&lt;/code&gt; va être créé,&lt;/li&gt;
&lt;li&gt;ce fichier contient une classe dans le namespace &lt;strong&gt;Ui&lt;/strong&gt;&amp;nbsp;: &lt;code&gt;Ui::MyWidget&lt;/code&gt; (pour rappel, MyWidget est le nom que j'ai donné à la &lt;em&gt;form&lt;/em&gt; dans le designer),&lt;/li&gt;
&lt;li&gt;cette classe contient une fonction importante&amp;nbsp;: &lt;code&gt;void setupUi(QWidget *MyWidget)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;&lt;a name=&quot;direct&quot;&gt;&lt;/a&gt; Méthode directe&lt;/h3&gt;


&lt;p&gt;La méthode directe est relativement simple&amp;nbsp;: un widget va être créé pour servir de conteneur à notre &lt;em&gt;form&lt;/em&gt;. Voici le .pro utilisé.&lt;/p&gt;
&lt;pre&gt;
TEMPLATE    = app
FORMS       = mywidget.ui
SOURCES     = main.cpp
&lt;/pre&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&amp;nbsp;: il ne faut pas indiquer le fichier créé par &lt;code&gt;uic&lt;/code&gt;, ici &lt;code&gt;ui_mywidget.h&lt;/code&gt;, ce dernier étant implicitement déclaré par le &lt;code&gt;FORMS&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;La fonction &lt;code&gt;main&lt;/code&gt; va créer un widget qui servira de conteneur à l'interface&amp;nbsp;: c'est la ligne &lt;code&gt;ui.setupUi(window);&lt;/code&gt;. Voici le fichier complet&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;QApplication&amp;gt;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;quot;ui_mywidget.h&amp;quot;&lt;/span&gt;
&amp;nbsp;
&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;#91;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&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;
    QApplication app&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;argc, argv&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    QWidget *window = &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; QWidget;
    Ui::&lt;span style=&quot;color: #00eeff;&quot;&gt;MyWidget&lt;/span&gt; ui;
    ui.&lt;span style=&quot;color: #00eeff;&quot;&gt;setupUi&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;window&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
    window-&amp;gt;show&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; app.&lt;span style=&quot;color: #00eeff;&quot;&gt;exec&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: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Bien que rapide et simple d'utilisation, &lt;strong&gt;cette méthode est très limitée&lt;/strong&gt; car elle ne permet pas de définir des signaux et slots, de connecter des éléments entre eux... cette méthode est utile pour des fenêtres statiques, comme par exemple des fenêtres &lt;q&gt;A propos&lt;/q&gt;.&lt;/p&gt;



&lt;h3&gt;&lt;a name=&quot;simple&quot;&gt;&lt;/a&gt; Méthode héritage simple&lt;/h3&gt;


&lt;p&gt;Ici, plutôt que de créer un widget puis de lui appliquer une interface à l'aide de la fonction &lt;code&gt;setupUi&lt;/code&gt;, nous allons créer une classe qui hérite de &lt;code&gt;QWidget&lt;/code&gt; (ou &lt;code&gt;QDialog&lt;/code&gt;/&lt;code&gt;QMainWindow&lt;/code&gt;, en fonction du type de &lt;em&gt;form&lt;/em&gt; créée) et lui appliquer l'interface dans le constructeur&amp;nbsp;: une instance de la classe &lt;code&gt;Ui::MyWidget&lt;/code&gt; est déclarée comme membre de notre classe.&lt;/p&gt;

&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;quot;ui_mywidget.h&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;QWidget&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; MyWidget : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QWidget
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
    Q_OBJECT
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:
    MyWidget&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QWidget *parent = &lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
...
&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:
    Ui::&lt;span style=&quot;color: #00eeff;&quot;&gt;MyWidget&lt;/span&gt; ui;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;


&lt;p&gt;Il est toujours nécessaire d'appeler la fonction &lt;code&gt;setupUi&lt;/code&gt;, mais cette fois-ci dans le constructeur de notre classe &lt;code&gt;MyWidget&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;MyWidget::&lt;span style=&quot;color: #00eeff;&quot;&gt;MyWidget&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QWidget *parent&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
    : QWidget&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;parent&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;
    ui.&lt;span style=&quot;color: #00eeff;&quot;&gt;setupUi&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;this&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;/pre&gt;


&lt;p&gt;L'avantage ici, c'est que la déclaration de l'interface est un membre de la classe, les différents widgets ainsi que les layouts/signaux/méthodes sont donc directement accessible dans notre classe &lt;code&gt;MyWidget&lt;/code&gt;. Nous allons par exemple ajouter un slot &lt;code&gt;clickMe()&lt;/code&gt; qui sera connecté sur un clic sur le bouton &lt;q&gt;Cliquez moi !!&lt;/q&gt; (qui porte bien son nom)&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;MyWidget::&lt;span style=&quot;color: #00eeff;&quot;&gt;MyWidget&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QWidget *parent&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
    : QWidget&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;parent&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;
    ui.&lt;span style=&quot;color: #00eeff;&quot;&gt;setupUi&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;ui.&lt;span style=&quot;color: #00eeff;&quot;&gt;pushButton&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;clicked&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;, &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;clickMe&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;&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;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; MyWidget::&lt;span style=&quot;color: #00eeff;&quot;&gt;clickMe&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: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
    ui.&lt;span style=&quot;color: #00eeff;&quot;&gt;lineEdit&lt;/span&gt;-&amp;gt;setText&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;YEAH !!!&amp;quot;&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;/pre&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&amp;nbsp;: remarquez ici que tous les widgets qui composent la &lt;em&gt;form&lt;/em&gt; sont appelés à l'aide du membre &lt;strong&gt;ui&lt;/strong&gt;.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Cette méthode offre de &lt;strong&gt;nombreux avantages&lt;/strong&gt; au développeur&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;accès aux différents widgets de la &lt;em&gt;form&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;encapsulation de l'interface dans un widget facilement utilisable,&lt;/li&gt;
&lt;li&gt;possibilité d'utiliser plusieurs interfaces...&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;A propos des noms&lt;/h4&gt;

&lt;p&gt;Comme vous l'avez remarqué, j'ai employé le même nom partout&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3 fichiers&amp;nbsp;: &lt;code&gt;mywidget.ui&lt;/code&gt;, &lt;code&gt;mywidget.h&lt;/code&gt; et &lt;code&gt;mywidget.cpp&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;dans le designer, l'interface s'appelle &lt;code&gt;MyWidget&lt;/code&gt; et lors de la compilation, la classe &lt;code&gt;Ui::MyWidget&lt;/code&gt; est créée,&lt;/li&gt;
&lt;li&gt;la classe dérivée s'appelle aussi &lt;code&gt;MyWidget&lt;/code&gt; (pas de problème de nommage, la classe précédente étant dans un namespace).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C'est une préférence personnelle, mais &lt;em&gt;il est tout à fait possible d'utiliser des noms différents entre l'interface  et la classe dérivée&lt;/em&gt;. On peut par exemple imaginer deux classes différentes qui partagent la même interface.&lt;/p&gt;



&lt;h4&gt;Compilation&lt;/h4&gt;

&lt;p&gt;Il est nécessaire de modifier notre fichier .pro utilisé pour la compilation, en ajoutant la classe créée&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
TEMPLATE    = app
FORMS       = mywidget.ui
SOURCES     = main.cpp \
              mywidget.cpp
HEADERS     = mywidget.h
&lt;/pre&gt;


&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&amp;nbsp;: il ne faut pas indiquer le fichier créé par &lt;code&gt;uic&lt;/code&gt;, ici &lt;code&gt;ui_mywidget.h&lt;/code&gt;, ce dernier étant implicitement déclaré par le &lt;code&gt;FORMS&lt;/code&gt;&lt;/p&gt;&lt;/blockquote&gt;



&lt;h3&gt;&lt;a name=&quot;multiple&quot;&gt;&lt;/a&gt; Méthode héritage multiple&lt;/h3&gt;


&lt;p&gt;Cette méthode est très proche de la méthode précédente (les notes sur le choix des noms et sur la compilation sont toujours valables), la différence étant que l'interface n'est plus un membre de la classe héritée, mais elle est aussi héritée par le widget&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;quot;ui_mywidget.h&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #339900;&quot;&gt;#include &amp;lt;QWidget&amp;gt;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; MyWidget : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QWidget, &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; Ui::&lt;span style=&quot;color: #00eeff;&quot;&gt;MyWidget&lt;/span&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
    Q_OBJECT
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:
    MyWidget&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QWidget *parent = &lt;span style=&quot;color: #0000dd;&quot;&gt;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;#125;&lt;/span&gt;;&lt;/pre&gt;


&lt;p&gt;Nous avons effectué un héritage privé, pour ne pas exposer l'interface dans les éventuelles sous-classes de notre classe. Mais nous pourrions très bien faire un héritage protégé ou publique afin qu'elle soit accessible.&lt;/p&gt;


&lt;p&gt;Là encore, il est nécessaire d'appeler la méthode &lt;code&gt;setupUi&lt;/code&gt;, mais les méthodes et les widgets sont directement accessibles dans le code du widget (il n'est plus nécessaire d'utiliser &lt;strong&gt;ui&lt;/strong&gt;)&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;MyWidget::&lt;span style=&quot;color: #00eeff;&quot;&gt;MyWidget&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QWidget *parent&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
    : QWidget&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;parent&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;
    setupUi&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;this&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;/pre&gt;


&lt;p&gt;Personnellement, c'est ma méthode préférée&amp;nbsp;: elle offre une &lt;strong&gt;meilleure lisibilité du code&lt;/strong&gt;, par contre il n'est plus possible de modifier l'interface (mais était-ce vraiment un problème ?).&lt;/p&gt;



&lt;h3&gt;Connexions automatiques&lt;/h3&gt;


&lt;p&gt;Depuis Qt4, il n'est plus possible de créer des slots directement dans le designer et de les connecter graphiquement... il est donc nécessaire de définir la connexion dans le constructeur (comme nous l'avons fait pour la &lt;a href=&quot;http://doc.qtfr.org/post/2007/04/01/#simple&quot;&gt;méthode héritage simple&lt;/a&gt;). Mais il est possible de définir des connexions automatiques avec des noms de slots utilisant une certaine convention&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt; on_&amp;lt;nom du widget&amp;gt;_&amp;lt;nom du signal&amp;gt;(&amp;lt;paramètres du signal&amp;gt;);&lt;/pre&gt;


&lt;p&gt;Lors de la compilation de la &lt;em&gt;form&lt;/em&gt; par &lt;code&gt;uic&lt;/code&gt;, il génère le code nécessaire à la création automatique des connexions. Dans notre exemple, nous aurions pu utiliser le slot suivant&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; MyWidget::&lt;span style=&quot;color: #00eeff;&quot;&gt;on_pushButton_clicked&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: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
    ui.&lt;span style=&quot;color: #00eeff;&quot;&gt;lineEdit&lt;/span&gt;-&amp;gt;setText&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;YEAH !!!&amp;quot;&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;/pre&gt;</description>
    
          <enclosure url="http://doc.qtfr.org/public/2007/designer.tar.gz"
      length="1483" type="application/x-gzip" />
    
    
      </item>
    
  <item>
    <title>Un conteneur pour MPlayer (utilisation de QProcess)</title>
    <link>http://doc.qtfr.org/post/2007/03/21/Un-conteneur-pour-MPlayer-utilisation-de-QProcess</link>
    <guid isPermaLink="false">urn:md5:afa61892107e63fea382cac105f90974</guid>
    <pubDate>Mon, 02 Apr 2007 09:01:00 +0200</pubDate>
    <dc:creator>IrmatDen</dc:creator>
        <category>Tutoriels</category>
        <category>class_QProcess</category><category>class_QWidget</category><category>intégration</category><category>MPlayer</category><category>version_PyQt4</category><category>version_Qt3</category><category>version_Qt4</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Comment visualiser une vidéo dans Qt&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment intégrer MPlayer et Qt&amp;nbsp;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qt, dans son souci de framework généraliste, n'implémente pas toujours tout ce dont on peut avoir besoin, surtout lorsque cela n'est pas d'usage courant. Les vidéos font partie de ce qui n'était pas couvert par Qt (maintenant supporté depuis la 4.4 par le biais de Phonon). Cependant, un grand nombre de librairies et autres backends existent.
Nous allons voir comment utiliser l'un d'entre eux: &lt;a href=&quot;http://www.mplayerhq.hu/design7/news.html&quot;&gt;MPlayer&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Version concernée&lt;/strong&gt;&amp;nbsp;: Toutes versions (exemple fait avec C++/Qt4 et une version pyQt disponible)&lt;br /&gt;
&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: Denys Bulant (&lt;a href=&quot;http://qtfr.org/forum/profile.php?id=291&quot;&gt;IrmatDen&lt;/a&gt;), &lt;a href=&quot;http://forum.qtfr.org/profile.php?id=2344&quot;&gt;alteo_gange&lt;/a&gt; et &lt;a href=&quot;http://forum.qtfr.org/profile.php?id=4253&quot;&gt;egaudrain&lt;/a&gt; pour les versions pyQt&lt;br /&gt;
&lt;strong&gt;Résumé&lt;/strong&gt;&amp;nbsp;: utiliser MPlayer conjointement à Qt pour afficher une vidéo&lt;br /&gt;
&lt;strong&gt;Fil de discussion&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://forum.qtfr.org/viewtopic.php?pid=14373&quot;&gt;Forum&lt;/a&gt;&lt;/p&gt;    &lt;h3&gt;Généralité sur MPlayer en tant que backend...&lt;/h3&gt;

&lt;p&gt;La particularité de MPlayer est de ne pas s'intégrer par le biais d'une api, mais par un process externe. Les applications désirant l'utiliser en tant que tel, doivent communiquer avec lui par le biais de son flux d'entrée. Les flux de sorties (standard/erreur) peuvent bien sûr être analysés pour récupérer diverses infos sur la vidéo ainsi que les réponses à des requêtes pouvant être formulées par votre application.&lt;/p&gt;


&lt;p&gt;Voici ce dont vous aurez besoin&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mplayerhq.hu/design7/dload.html&quot;&gt;MPlayer&lt;/a&gt; installé, et fonctionnel,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mplayerhq.hu/DOCS/man/en/mplayer.1.html&quot;&gt;La page des options de MPlayer&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;Et &lt;a href=&quot;http://www.mplayerhq.hu/DOCS/tech/slave.txt&quot;&gt;la liste des options en slave mode&lt;/a&gt; pour mplayer (c'est toutes les manip qui vous sont permises, donc considérez ce fichier comme votre référence ;)).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour utiliser MPlayer comme backend, il y a 2 arguments à lui passer &lt;strong&gt;impérativement&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l'id du widget à utiliser pour le rendu par le biais de &quot;-wid&quot;&lt;/li&gt;
&lt;li&gt;&quot;-slave&quot; qui permet de le mettre en mode esclave, d'où le nom  ;-)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemple de code lançant MPlayer comme backend:&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;QStringList args;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// On demande à utiliser mplayer comme backend&lt;/span&gt;
args &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;-slave&amp;quot;&lt;/span&gt;;
&lt;span style=&quot;color: #339900;&quot;&gt;#ifdef Q_WS_WIN&lt;/span&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// reinterpret_cast&amp;lt;unsigned int&amp;gt; obligatoire, HWND ne se laissant pas convertir gentiment ;)&lt;/span&gt;
args &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;-wid&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; QString::&lt;span style=&quot;color: #00eeff;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;reinterpret_cast&amp;lt;unsigned int&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;renderTarget-&amp;gt;winId&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;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #339900;&quot;&gt;#else&lt;/span&gt;
&lt;span style=&quot;color: #ff0000;&quot;&gt;// Sur linux, pas de manip pour Wid :)&lt;/span&gt;
args &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;-wid&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; QString::&lt;span style=&quot;color: #00eeff;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;renderTarget-&amp;gt;winId&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;;
&lt;span style=&quot;color: #339900;&quot;&gt;#endif&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;A savoir aussi que sur Windows, je n'ai trouvé que directx comme driver de sortie :/ Cela ne concerne pas les autres OS; lors de mon test sur Linux, je n'ai eu aucun driver à spécifier et cela marche nickel.&lt;/p&gt;


&lt;p&gt;Et apparemment les seuls drivers compatibles pour un embarquement de MPlayer sous Linux sont xv, x11 et gl. Et sous Linux, il faut faire attention à avoir un widget de taille raisonnable pour contenir la vidéo. En effet, contrairement à Windows, un resize à la volée n'est pas possible :/&lt;/p&gt;


&lt;p&gt;Ensuite, le mode esclave permet donc de commander MPlayer pour:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;obtenir des infos (ex: get_video_resolution/get_time_length/...)&lt;/li&gt;
&lt;li&gt;lui donner un ordre (ex: play/pause/quit/...)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tout ce qui lui est transmis, doit être terminé par un retour chariot. Si vous demandiez une information, elle sera renvoyée sur la sortie standard, avec un début de ligne propre à chaque commande (ex: get_video_resolution renverra &lt;code&gt;ANS_VIDEO_RESOLUTION='resX x resY'&lt;/code&gt;)&lt;/p&gt;


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

&lt;p&gt;&lt;img src=&quot;http://doc.qtfr.org/public/2006/previewqtmplayerui.png&quot; alt=&quot;Illustration MPlayer/Qt&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Voici un programme proposant les fonctionnalités suivantes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lecture d'une vidéo&lt;/li&gt;
&lt;li&gt;arrêt&lt;/li&gt;
&lt;li&gt;avancer/reculer en déplaçant le slider&lt;/li&gt;
&lt;li&gt;affiche le log de toutes ce qui sort sur les flux stdout et stderr de mplayer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vous le trouverez en annexe de ce tuto&amp;nbsp;; seuls les points essentiels sont repris ici par souci de clarté.
Pour vos tests, &lt;strong&gt;pensez à changer&lt;/strong&gt; les valeurs de &lt;code&gt;mPlayerPath&lt;/code&gt; et &lt;code&gt;movieFile&lt;/code&gt;, en haut du fichier.&lt;/p&gt;


&lt;p&gt;Ce n'est pas un frontend complet, mais cela vous permettra de voir fonctionner Qt 4 avec MPlayer en utilisant &lt;code&gt;QProcess&lt;/code&gt;  :)&lt;/p&gt;


&lt;p&gt;Comme dit dans l'introduction, une version pyQt a été réalisée par &lt;a href=&quot;http://forum.qtfr.org/profile.php?id=2344&quot;&gt;alteo_gange&lt;/a&gt;. Elle est disponible sur le &lt;a href=&quot;http://forum.qtfr.org/viewtopic.php?pid=31501#p31501&quot;&gt;forum&lt;/a&gt;. A noter qu'une version multi-plateforme a été postée par &lt;a href=&quot;http://forum.qtfr.org/profile.php?id=4253&quot;&gt;egaudrain&lt;/a&gt;; le code est dispo à ce &lt;a href=&quot;http://forum.qtfr.org/viewtopic.php?pid=37823#p37823&quot;&gt;post&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; PlayerWidget: &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; QWidget
&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
    Q_OBJECT
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:
    PlayerWidget&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QWidget *parent =&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;
        :QWidget&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;parent&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, isPlaying&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;false&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;#91;&lt;/span&gt;...&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;
        renderTarget = &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; QWidget;
        renderTarget-&amp;gt;setSizePolicy&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QSizePolicy&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QSizePolicy::&lt;span style=&quot;color: #00eeff;&quot;&gt;Fixed&lt;/span&gt;, QSizePolicy::&lt;span style=&quot;color: #00eeff;&quot;&gt;Fixed&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;;
        renderTarget-&amp;gt;setAttribute&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;Qt::&lt;span style=&quot;color: #00eeff;&quot;&gt;WA_PaintOnScreen&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        renderTarget-&amp;gt;setMinimumSize&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;320&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;240&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;#91;&lt;/span&gt;...&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;
&amp;nbsp;
        mplayerProcess = &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; QProcess&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
        &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;
        connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;mplayerProcess, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;readyReadStandardOutput&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;,
            &lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;catchOutput&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;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        connect&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;mplayerProcess, &lt;span style=&quot;color: #0000ff;&quot;&gt;SIGNAL&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;finished&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;, QProcess::&lt;span style=&quot;color: #00eeff;&quot;&gt;ExitStatus&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: #0000dd;&quot;&gt;this&lt;/span&gt;, SLOT&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;mplayerEnded&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;, QProcess::&lt;span style=&quot;color: #00eeff;&quot;&gt;ExitStatus&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;#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;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;protected&lt;/span&gt;:
    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; closeEvent&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QCloseEvent *e&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;#91;&lt;/span&gt;...&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&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;private&lt;/span&gt;:
    &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; startMPlayer&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;#91;&lt;/span&gt;...&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;
        QStringList args;
        &lt;span style=&quot;color: #ff0000;&quot;&gt;// On demande à utiliser mplayer comme backend&lt;/span&gt;
        args &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;-slave&amp;quot;&lt;/span&gt;;
        &lt;span style=&quot;color: #ff0000;&quot;&gt;// Et on veut ne pas avoir trop de chose à parser  :) &lt;/span&gt;
        args &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;-quiet&amp;quot;&lt;/span&gt;;
&amp;nbsp;
&lt;span style=&quot;color: #339900;&quot;&gt;#ifdef Q_WS_WIN&lt;/span&gt;
        &lt;span style=&quot;color: #ff0000;&quot;&gt;// reinterpret_cast&amp;lt;qlonglong&amp;gt; obligatoire, winId() ne se laissant pas convertir gentiment ;)&lt;/span&gt;
        args &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;-wid&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; QString::&lt;span style=&quot;color: #00eeff;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;reinterpret_cast&amp;lt;qlonglong&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;renderTarget-&amp;gt;winId&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;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        args &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;-vo&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;directx:noaccel&amp;quot;&lt;/span&gt;;
&lt;span style=&quot;color: #339900;&quot;&gt;#else&lt;/span&gt;
        &lt;span style=&quot;color: #ff0000;&quot;&gt;// Sur linux, aucun driver n'a été nécessaire et pas de manip pour Wid :)&lt;/span&gt;
        args &amp;lt;&amp;lt; &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;-wid&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; QString::&lt;span style=&quot;color: #00eeff;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;renderTarget-&amp;gt;winId&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;;
        log-&amp;gt;append&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;Video output driver may not be necessary for your platform. &lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\&lt;/span&gt;
                    Check: http://www.mplayerhq.hu/DOCS/man/en/mplayer.1.html &lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\&lt;/span&gt;
                    at the VIDEO OUTPUT DRIVERS section.&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #339900;&quot;&gt;#endif&lt;/span&gt;
&amp;nbsp;
        args &amp;lt;&amp;lt; movieFile;
        qDebug&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;args.&lt;span style=&quot;color: #00eeff;&quot;&gt;join&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; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;toUtf8&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: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
&amp;nbsp;
        &lt;span style=&quot;color: #ff0000;&quot;&gt;// On parse la stdout et stderr au même endroit, donc on demande à &amp;quot;fusionnner&amp;quot; les 2 flux&lt;/span&gt;
        mplayerProcess-&amp;gt;setProcessChannelMode&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QProcess::&lt;span style=&quot;color: #00eeff;&quot;&gt;MergedChannels&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        mplayerProcess-&amp;gt;start&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;mplayerPath, args&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;!mplayerProcess-&amp;gt;waitForStarted&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;3000&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;
            qDebug&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;allez, cherche le bug :o&amp;quot;&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: #0000ff;&quot;&gt;false&lt;/span&gt;;
        &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #ff0000;&quot;&gt;// On récupère les infos de base&lt;/span&gt;
        mplayerProcess-&amp;gt;write&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;get_video_resolution&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
        mplayerProcess-&amp;gt;write&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;get_time_length&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&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;#91;&lt;/span&gt;...&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&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;bool&lt;/span&gt; stopMPlayer&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;#91;&lt;/span&gt;...&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&lt;/span&gt;
        mplayerProcess-&amp;gt;write&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;quit&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&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;!mplayerProcess-&amp;gt;waitForFinished&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;3000&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;
            qDebug&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;ZOMG, ça plante :(&amp;quot;&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: #0000ff;&quot;&gt;false&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;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;true&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;private&lt;/span&gt; slots:
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; catchOutput&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: #0000ff;&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;mplayerProcess-&amp;gt;canReadLine&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;
        &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#123;&lt;/span&gt;
            QByteArray buffer&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;mplayerProcess-&amp;gt;readLine&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;;
            log-&amp;gt;append&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QString&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;buffer&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;;
&amp;nbsp;
            &lt;span style=&quot;color: #ff0000;&quot;&gt;// On vérifie si on a eu des réponses&lt;/span&gt;
            &lt;span style=&quot;color: #ff0000;&quot;&gt;// réponse à get_video_resolution : ANS_VIDEO_RESOLUTION='176 x 144'&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;buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;startsWith&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;ANS_VIDEO_RESOLUTION&amp;quot;&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;
                buffer.&lt;span style=&quot;color: #0000dd;&quot;&gt;remove&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;21&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
                buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;quot;&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;;
                buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;quot;&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;;
                buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;quot;&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;;
                buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;quot;&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: #0000ff;&quot;&gt;int&lt;/span&gt; sepIndex = buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;indexOf&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;'x'&lt;/span&gt;&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; resX = buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;sepIndex&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;toInt&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;int&lt;/span&gt; resY = buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;mid&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;sepIndex&lt;span style=&quot;color: #0000dd;&quot;&gt;+1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;toInt&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;;
                renderTarget-&amp;gt;setMinimumSize&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;resX, resY&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;// réponse à get_time_length : ANS_LENGTH=45.28&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;buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;startsWith&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;ANS_LENGTH&amp;quot;&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;
                buffer.&lt;span style=&quot;color: #0000dd;&quot;&gt;remove&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
                buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;quot;&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;;
                buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;quot;&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;;
                buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;quot;&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;;
                buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;quot;&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: #0000ff;&quot;&gt;float&lt;/span&gt; maxTime = buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;toFloat&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;;
                timeLine-&amp;gt;setMaximum&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;static_cast&amp;lt;int&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;maxTime&lt;span style=&quot;color: #0000dd;&quot;&gt;+1&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;#125;&lt;/span&gt;
            &lt;span style=&quot;color: #ff0000;&quot;&gt;// réponse à get_time_pos : ANS_TIME_POSITION=2.4&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;buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;startsWith&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;ANS_TIME_POSITION&amp;quot;&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;
                buffer.&lt;span style=&quot;color: #0000dd;&quot;&gt;remove&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;, &lt;span style=&quot;color: #0000dd;&quot;&gt;18&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
                buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;quot;&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;;
                buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;quot;&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;;
                buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;quot;&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;;
                buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\r&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;, QByteArray&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;&amp;quot;&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: #0000ff;&quot;&gt;float&lt;/span&gt; currTime = buffer.&lt;span style=&quot;color: #00eeff;&quot;&gt;toFloat&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;;
                timeLine-&amp;gt;setValue&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;static_cast&amp;lt;int&amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;currTime&lt;span style=&quot;color: #0000dd;&quot;&gt;+1&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;#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;
&amp;nbsp;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; pollCurrentTime&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;
        mplayerProcess-&amp;gt;write&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;get_time_pos&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&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;
&amp;nbsp;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;// Dirige la timeline&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; timeLineChanged&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; pos&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;
        mplayerProcess-&amp;gt;write&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;QString&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot;seek &amp;quot;&lt;/span&gt; + QString::&lt;span style=&quot;color: #00eeff;&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#40;&lt;/span&gt;pos&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt; + &lt;span style=&quot;color: #666666;&quot;&gt;&amp;quot; 2&lt;span style=&quot;color: #666666; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #00eeff;&quot;&gt;toUtf8&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: #000000;&quot;&gt;&amp;#41;&lt;/span&gt;;
    &lt;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;// Play/stop&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; switchPlayState&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;#91;&lt;/span&gt;...&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&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;void&lt;/span&gt; mplayerEnded&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; exitCode, QProcess::&lt;span style=&quot;color: #00eeff;&quot;&gt;ExitStatus&lt;/span&gt; exitStatus&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;#91;&lt;/span&gt;...&lt;span style=&quot;color: #000000;&quot;&gt;&amp;#93;&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;private&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;
    QWidget *renderTarget;
    QProcess *mplayerProcess;
    &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;span style=&quot;color: #000000;&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;


&lt;h3&gt;Si vous avez des remarques...&lt;/h3&gt;

&lt;p&gt;Si vous avez besoin d'un éclaircissement, vous pouvez le faire &lt;a href=&quot;http://qtfr.org/forum/viewtopic.php?pid=14373#p14373&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;</description>
    
          <enclosure url="http://doc.qtfr.org/public/2007/qt_mplayer.tar.gz"
      length="2452" type="application/x-gzip" />
    
    
      </item>
    
  <item>
    <title>Utilisation du designer avec PyQt4</title>
    <link>http://doc.qtfr.org/post/2007/03/30/Utilisation-du-designer-avec-PyQt4</link>
    <guid isPermaLink="false">urn:md5:2bb55125ec6435107c6eab7fe948c3f2</guid>
    <pubDate>Fri, 30 Mar 2007 21:03:00 +0200</pubDate>
    <dc:creator>Visiteur</dc:creator>
        <category>Documentation</category>
        <category>designer</category><category>version_PyQt4</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Comment utiliser le designer avec PyQt4&amp;nbsp;?&lt;/li&gt;
&lt;li&gt;Comment intégrer les widgets créer avec le designer dans un programme python&amp;nbsp;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cet article va détailler l'intégration d'un widget créer avec le designer Qt dans un programme python, en utilisant le binding python de &lt;a href=&quot;http://www.riverbankcomputing.co.uk/pyqt/&quot; hreflang=&quot;en&quot;&gt;PyQt&lt;/a&gt; de Riverbank. Il va aussi détailler l'utilisation de &lt;code&gt;pyuic&lt;/code&gt;, qui permet de générer le code python à partir des fichiers créés par le designer.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: Kib² (&lt;a href=&quot;http://forum.qtfr.org/profile.php?id=428&quot;&gt;tool69&lt;/a&gt;) &lt;br /&gt;
&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: PyQt4 (&lt;a href=&quot;http://www.riverbankcomputing.co.uk/pyqt/&quot; hreflang=&quot;en&quot;&gt;Riverbank&lt;/a&gt;)&lt;/p&gt;    &lt;p&gt;L'article est disponible sur le site de &lt;strong&gt;Kib²&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://kib2.webfactional.com/blog/2006/nov/11/comment-utiliser-qtdesigner-avec-pyqt4/&quot; title=&quot;http://kib2.webfactional.com/blog/2006/nov/11/comment-utiliser-qtdesigner-avec-pyqt4/&quot;&gt;http://kib2.webfactional.com/blog/2...&lt;/a&gt;.&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;Si jamais vous avez déjà programmé en Python avec la bibliothèque d'origine TkInter, vous savez déjà que coder une interface utilisateur à la main est une tâche à la fois longue et fastidieuse.&lt;/p&gt;
&lt;p&gt;
QtDesigner est l'outil fourni par la bibliothèque Qt qui vous permet de réaliser une GUI (en Français une IHM&amp;nbsp;: Interface Homme-Machine), par le biais d'un système de glisser-déposer. Il est ainsi possible de créer trois types de «&amp;nbsp;formes&amp;nbsp;» : des widgets, des dialogues ou des applications, tout ceci vous étant demandé par QtDesigner lors de création d'une nouvelle «&amp;nbsp;form&amp;nbsp;» (à partir du menu, choisir File/New Form).&lt;/p&gt;
&lt;p&gt;
QtDesigner ne génère pas de code source directement. Il peut uniquement sauvegarder votre «&amp;nbsp;forme&amp;nbsp;» avec l'extension «&amp;nbsp;.ui », un dérivé du format XML. Il vous est alors possible, grâce à un module nommé «&amp;nbsp;uic&amp;nbsp;» (lui même écrit en Python) de générer le code Python à l'interface que vous avez précédemment déssiné. C'est à la fois un gain de temps et de productivité, mais aussi une bonne façon de séparer le fond de la forme de votre interface.&lt;/p&gt;
&lt;p&gt;
C'est l'utilitaire en ligne de commande nommé «&amp;nbsp;pyuic4&amp;nbsp;» qui vous permettra de manipuler le module «&amp;nbsp;uic », il sera détaillé un peu plus loin.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Il est aussi disponible en &lt;strong&gt;libre téléchargement&lt;/strong&gt; en annexe au format PDF et html.&lt;/p&gt;</description>
    
          <enclosure url="http://doc.qtfr.org/public/2007/pyqt4-designer.html"
      length="62999" type="text/html" />
          <enclosure url="http://doc.qtfr.org/public/2007/pyqt4-designer.pdf"
      length="122852" type="application/pdf" />
    
    
      </item>
    
  <item>
    <title>Compiler Qt 4 avec Visual C++ 2005</title>
    <link>http://doc.qtfr.org/post/2007/03/26/Compiler-Qt-4-avec-Visual-C-2005</link>
    <guid isPermaLink="false">urn:md5:3b6dac9b1e7e567528e9b64b47c264ef</guid>
    <pubDate>Mon, 26 Mar 2007 21:14:00 +0200</pubDate>
    <dc:creator>Visiteur</dc:creator>
        <category>Installation</category>
        <category>installation</category><category>version_Qt4</category><category>Windows</category>    
    <description>&lt;ul&gt;
&lt;li&gt;Installation de Qt4 avec Visual C++ 2005&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La version Open-Source de Qt4 n'est compatible &lt;em&gt;officiellement&lt;/em&gt; sous Windows qu'avec le compilateur &lt;a href=&quot;http://www.mingw.org/&quot; hreflang=&quot;en&quot;&gt;mingw&lt;/a&gt;. Il est toutefois possible d'utiliser Visual C++.&lt;/p&gt;


&lt;p&gt;Sachez toutefois que &lt;strong&gt;cette installation n'est pas supporté officiellement&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Auteur&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://arb.developpez.com/&quot;&gt;Aurélien Regat-Barrel&lt;/a&gt; &lt;br /&gt;
&lt;strong&gt;Version&lt;/strong&gt;&amp;nbsp;: Qt4 Windows &lt;br /&gt;
&lt;strong&gt;Test&lt;/strong&gt;&amp;nbsp;: Qt 4.1.1&lt;/p&gt;    &lt;p&gt;L'article est disponible sur le site de &lt;strong&gt;developpez.com&lt;/strong&gt;&amp;nbsp;: &lt;a href=&quot;http://arb.developpez.com/qt4/vc++/compilation/&quot; title=&quot;http://arb.developpez.com/qt4/vc++/compilation/&quot;&gt;http://arb.developpez.com/qt4/vc++/...&lt;/a&gt;&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;Cet article a pour but de faciliter la compilation Qt/Windows Open Source Edition avec Microsoft Visual C++ 2005. Il présente aussi de manière détaillée le processus de compilation et le principe de configuration de cette bibliothèque.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Vous trouverez également un article sur notre forum&amp;nbsp;: &lt;a href=&quot;http://forum.qtfr.org/viewtopic.php?id=1531&quot; title=&quot;http://forum.qtfr.org/viewtopic.php?id=1531&quot;&gt;http://forum.qtfr.org/viewtopic.php...&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>