<?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 - signaux-slots</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>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>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>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>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>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>
    
</channel>
</rss>