<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>C++, Qt et GPU &#187; Qt5</title>
	<atom:link href="https://blog.developpez.com/gpu/?cat=13&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/gpu</link>
	<description></description>
	<lastBuildDate>Fri, 24 May 2013 17:02:21 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Développez en natif pour Android avec Qt 5.1</title>
		<link>https://blog.developpez.com/gpu/?p=522</link>
		<comments>https://blog.developpez.com/gpu/?p=522#comments</comments>
		<pubDate>Thu, 23 May 2013 11:24:04 +0000</pubDate>
		<dc:creator><![CDATA[gbdivers]]></dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Facile]]></category>
		<category><![CDATA[Qt5]]></category>
		<category><![CDATA[QtQuick]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/gpu/?p=522</guid>
		<description><![CDATA[La sortie de Qt 5.1 est prévue en release candidat pour le 27 mai. Cette version propose le support d&#8217;Android et iOS, bien qu&#8217;il était déjà possible de porter sur Android avec Qt 4.8 et le projet Necessitas. Je vais &#8230; <a href="https://blog.developpez.com/gpu/?p=522">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>La sortie de Qt 5.1 est prévue en release candidat pour le 27 mai. Cette version propose le support d&rsquo;Android et iOS, bien qu&rsquo;il était  déjà possible de porter sur Android avec Qt 4.8 et le projet <a href="http://www.developpez.net/forums/d1278983/plateformes/android-necessitas-port-android-qt-integre-au-qt-project/">Necessitas</a>. Je vais vous présenter ici comment créer une application Qt pour Android sous Ubuntu 13.04.</p>
<p><span id="more-522"></span></p>
<h1>Vue d&rsquo;ensemble</h1>
<p>Avant de commencer, une remarque sur Windows. À priori, il est possible de travailler sur Windows. Cependant, les binaires Qt pour Android ne sont disponibles que pour Linux. Comme la compilation de Qt pour Windows est pénible et que je ne l&rsquo;ai pas faite depuis longtemps, je présente seulement l&rsquo;utilisation de Linux. Pour ceux qui aimeraient pouvoir utiliser Windows&#8230; tant pis pour vous <img src="https://blog.developpez.com/gpu/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Je n&rsquo;avais pas testé Qt sur Android depuis quelques temps, en fait depuis Qt 4.8 et Necessitas. Du coup, j&rsquo;ai découvert le portage Android dans Qt 5.1 en même temps que je prenais des notes pour cet article. Comme base de travail, je suis parti des pages des pages de documentation de Qt : <a href="http://doc-snapshot.qt-project.org/qt5-stable/qtdoc/android-support.html">Qt &#8211; Android support</a>.</p>
<p>L&rsquo;utilisation de Qt sur Android nécessite l&rsquo;installation de plusieurs outils :</p>
<ul>
<li>la version de <a href="http://download.qt-project.org/development_releases/qt/5.1/5.1.0-beta1/">Qt 5.1 pour Android</a> : ok, on s&rsquo;y attendait un peu. Contient la bibliothèque complète et Qt Creator ;</li>
<li>le <a href="http://developer.android.com/sdk/index.html">kit de développement (SDK) pour Android</a> : permet de créer des applications Java pour Android et un simulateur pour tester ses applications ;</li>
<li>le <a href="http://developer.android.com/tools/sdk/ndk/index.html">kit de développement natif (NDK) pour Android</a> : permet de créer des applications C++ pour Android ;</li>
<li>l&rsquo;<a href="http://openjdk.java.net/install/index.html">environnement d&rsquo;exécution de Java (JRE)</a> : nécessaire pour le SDK Android ;</li>
<li><a href="http://ant.apache.org/bindownload.cgi">Apache Ant</a> : pour faire beau. (bon ok, ce n&rsquo;est pas que pour faire beau, ça sert au déploiement. Mais comme c&rsquo;est un outil Java, je ne connais pas du tout).</li>
</ul>
<p>Dans ce tutoriel, je vais montrer l&rsquo;utilisation de Qt Creator, mais il doit être possible d&rsquo;utiliser d&rsquo;autres outils.</p>
<h1>Installations</h1>
<h2>Installation de OpenJDK 7</h2>
<p>Pour commencer, il faut installer l&rsquo;environnement d&rsquo;exécution de Java. Il est fort possible qu&rsquo;il soit déjà installé. Dans la documentation, il est indiqué qu&rsquo;il faut par exemple OpenJDK en version 6 ou plus récente.</p>
<p><del datetime="2013-05-24T14:58:09+00:00">Personnellement, j&rsquo;avais la version 7. Cependant, j&rsquo;ai eu des problème avec Apache Ant, qui me retournait une erreur. J&rsquo;ai donc dû installer la version 6 en plus. Comme j&rsquo;ai pas mal bidouillé, je ne suis pas sûr de la procédure. Si des personnes testent et remarquent des problèmes, n&rsquo;hésitez pas à me le signaler.</del></p>
<p><em>Merci à <a href="http://www.developpez.net/forums/u657013/rotoom/">rotoOm</a> qui m&rsquo;a indiqué l&rsquo;origine du problème. Il suffit en fait d&rsquo;installer le JDK en plus du JRE. Merci à lui pour l&rsquo;information.</em></p>
<p>Vous pouvez tester si Java est installé avec la ligne de commande suivante :</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">java -version</div></div>
<p>Pour l&rsquo;installation, j&rsquo;ai donc utilisé les paquets fournis par Ubuntu. Il faut donc juste taper ces lignes de commande :</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sudo apt-get install openjdk-6-jre<br />
sudo apt-get install openjdk-7-jdk</div></div>
<p>Pour les autres systèmes Linux, vous pouvez consulter la page de documentation d&rsquo;OpenJDK : <a href="http://openjdk.java.net/install/index.html">How to download and install prebuilt OpenJDK packages</a>.</p>
<h2>Installation d&rsquo;Apache Ant</h2>
<p>Pour l&rsquo;installation d&rsquo;Apache Ant, même méthode, j&rsquo;utilise les paquets Ubuntu :</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sudo apt-get -u install ant</div></div>
<p>Pour tester l&rsquo;installation d&rsquo;Apache Ant, vous pouvez taper la ligne de commande suivante :</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ant -version</div></div>
<h2>Installation du SDK Android</h2>
<h3>Pourquoi installer le kit de développement Java ?</h3>
<p>Pour commencer, on ne peut se poser une question : pourquoi installer le kit de développement Java et le kit de développement natif et pas simplement ce dernier ? La réponse est simple : parce qu&rsquo;on ne peut développer que en Java pour Android !</p>
<p>Ok&#8230;</p>
<p>Donc cela veut dire qu&rsquo;il faudra utiliser le binding Java de Qt ? On parlait pas de développement C++ dans ce tutoriel ?</p>
<p>Oui, pas d&rsquo;inquiétude <img src="https://blog.developpez.com/gpu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> En fait, il y a un point à savoir sur les applications natives C++ sur Android. C&rsquo;est une application Java qui appelle un &laquo;&nbsp;module&nbsp;&raquo; écrit en C++ (on utilise le terme &laquo;&nbsp;activité&nbsp;&raquo; en Java). Avec Qt, on va donc simplement créer notre code C++/Qt et Qt Creator va s&rsquo;occuper de créer l&rsquo;application Java qui appelle notre code.</p>
<p>Ouf !</p>
<h3>Installation</h3>
<p>L&rsquo;installation du SDK Android est simple aussi&#8230; puisqu&rsquo;il n&rsquo;y a pas d&rsquo;installation à faire. Vous devez simplement télécharger le <a href="http://developer.android.com/sdk/index.html">kit de développement pour Android</a> et décompresser l&rsquo;archive. Ce SDK contient les outils de développement Android, des plateformes de compilation, l&rsquo;éditeur Eclipse ADT (Android Developer Tools, configuré spécialement pour Android), un simulateur Android pour tester ses applications.</p>
<p>Pour installer d&rsquo;autres outils, par exemple d&rsquo;autres versions de plateforme, vous pouvez utiliser le SDK Manager. Dans Eclipse ADT, allez dans le menu Windows puis Android SDK Manager.</p>
<h3>Tester Eclipse</h3>
<p>Comme je suis curieux et que j&rsquo;ai envie de voir un peu comment fonctionne une application Java sur Android, j&rsquo;ai testé un peu Eclipse et Java. Ceux qui ne sont pas intéressés, vous pouvez passer directement à l&rsquo;installation du NDK.</p>
<p>Pour cela, j&rsquo;ai simplement suivi le tutoriel : <a href="http://developer.android.com/training/basics/firstapp/index.html">Building Your First App</a> (il faut reconnaître que la documentation est très claire et simple à suivre, même pour un développeur C++ comme moi).</p>
<p>Allez dans le répertoire d&rsquo;installation du SDK Android puis dans le répertoire eclipse/. Celui-ci contient un binaire eclipse, que vous lancez. Si c&rsquo;est la première utilisation d&rsquo;Eclipse, il va falloir faire quelques réglages de configuration. En premier le Workspace (l&rsquo;espace de travail d&rsquo;Eclipse, dans lequel il range les fichiers). Personnellement, j&rsquo;ai accepté toutes les valeurs par défaut.</p>
<p>Une fois qu&rsquo;Eclipse est lancé, créez un nouveau projet de type &laquo;&nbsp;Android Application Project&nbsp;&raquo; dans Fichier puis Créer un projet. Un dialogue permet de donner un nom à votre application (c&rsquo;est le nom qui apparaîtra sur le téléphone), la version minimale d&rsquo;Android à prendre en charge et la version Android de destination. J&rsquo;ai laissé par défaut. Vous pouvez ensuite choisir l&rsquo;icône de l&rsquo;application et le type d&rsquo;activité. Choisissez BlanckActivity, qui va créer une activité &laquo;&nbsp;hello world&nbsp;&raquo;.</p>
<p>Après quelques minutes (je vais rien dire que la lenteur d&rsquo;Eclipse&#8230;), un projet est créé, qui contient quelques fichiers et répertoires. Les plus importants sont :</p>
<ul>
<li>le fichier AndroidManifest.xml : contient les informations sur l&rsquo;application, en particulier les versions minimale et ciblée de la plateforme ;</li>
<li>le répertoire res/layout/ : contient les interfaces de l&rsquo;application, décrites dans des fichiers XML ;</li>
<li>le répertoire src/ : contient les sources Java du projet. Dans ce projet par défaut, il lance simplement une activité, qui affiche l&rsquo;interface décrite dans le fichier XML de layouts/ ;</li>
<li>les répertoires res/drawable-xxx/ : contient les images de l&rsquo;application.</li>
</ul>
<p>Comme c&rsquo;est une application Android, vous ne pouvez pas simplement la lancer comme une application de Bureau classique. Il existe deux méthodes pour la lancer : utiliser un simulateur ou déployer sur un téléphone.</p>
<h3>Tester l&rsquo;application sur simulateur</h3>
<p>Pour cela, il faut dans un premier temps créer un simulateur. Le SDK Android est fournit avec un gestionnaire, permettant de créer différentes configurations pour le simulateur, permettant ainsi de tester l&rsquo;application sur plusieurs types de téléphone.</p>
<p>Allez dans le menu Windows puis Android Virtual Device Manager. Dans le dialogue, créez un nouveau périphérique en cliquant sur &laquo;&nbsp;New&nbsp;&raquo;, puis configurez selon le type de téléphone que vous voulez tester. Par exemple, comme j&rsquo;ai un téléphone Samsung Galaxy S1, j&rsquo;ai choisit un écran 4&Prime; en 480*800. Après la création du périphérique, lancez-le.</p>
<p>Lancez ensuite l&rsquo;application en ouvrant le fichier java (dans src/) puis en cliquant sur le bouton Run. Un dialogue &laquo;&nbsp;Run As&#8230;&nbsp;&raquo; s&rsquo;ouvre pour choisir comment exécuter l&rsquo;application. Choisissez Android Application. Normalement, l&rsquo;application devrait se lancer.</p>
<h3>Tester l&rsquo;application sur téléphone</h3>
<p>Bon, un simulateur, c&rsquo;est bien, mais on aimerait avoir l&rsquo;application sur un vrai téléphone pour tester. Ce n&rsquo;est pas très compliqué non plus, mais il va falloir faire une manipulation sur le téléphone. Celle-ci permet d&rsquo;activer les fonctionnalités de développement du téléphone, en particulier le Debug Mode USB, qui permet de déployer des applications via un cable USB.</p>
<p>Pour Android 4.2, allez dans les paramètres puis dans le menu À propos du téléphone. Cliquez plusieurs fois sur Numéro de build par activer le mode développeur. Vous allez avoir un message confirmant le passage en mode Debug. Revenez ensuite à l&rsquo;écran précédent et allez dans les options de développeur. Activez le mode Debug USB. Pour les autres versions d&rsquo;Android, vous pouvez consulter la page suivante : <a href="http://developer.android.com/training/basics/firstapp/running-app.html#RealDevice">Run on a Real Device</a>.</p>
<p>Pour terminer, il suffit de brancher le téléphone sur l&rsquo;ordinateur avec un câble USB puis de lancer l&rsquo;application comme précédemment. L&rsquo;application devrait se lancer sur le téléphone.</p>
<h2>Installation du NDK Android</h2>
<p>Rien de compliqué ici non plus, il n&rsquo;y a pas d&rsquo;installation à faire, il faut simplement décompresser l&rsquo;archive.</p>
<h2>Installation de Qt Android</h2>
<p>Le plus simple, comme indiqué au début de ce tutoriel, est d&rsquo;utiliser les binaires fournis de <a href="http://download.qt-project.org/development_releases/qt/5.1/5.1.0-beta1/">Qt 5.1 pour Android</a>. Si vous n&rsquo;utilisez pas Ubuntu, il vous faudra compiler Qt vous-même. Bon courage <img src="https://blog.developpez.com/gpu/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Lancez le binaire Qt pour Android. Le processus d&rsquo;installation est classique, avec une particularité : le SDK propose par défaut l&rsquo;installation de Qt Desktop, mais pour Android (versions ARM ou x86), il faut l&rsquo;activer soi-même. Une fois l&rsquo;installation finie, allez dans les répertoires Tools, QtCreator, bin puis lancez qtcreator.</p>
<p>La première étape va être de configurer Android. Pour cela, allez dans le menu Outils puis Options. Dans la liste de gauche, allez dans Android, puis configurez les répertoires du SDK et du NDK. Cochez la case pour laisser Qt Creator créer automatiquement les kits de compilation.</p>
<p><a href="http://blog.developpez.com/gpu/files/2013/05/android.png"><img src="http://blog.developpez.com/gpu/files/2013/05/android-300x188.png" alt="android" width="300" height="188" class="aligncenter size-medium wp-image-555" /></a></p>
<p>Il faut ensuite créer un périphérique pour le simulateur si ce n&rsquo;est pas encore fait. Pour cela, cliquez sur le bouton Start Android AVD Manager. </p>
<p><a href="http://blog.developpez.com/gpu/files/2013/05/avd-manager.png"><img src="http://blog.developpez.com/gpu/files/2013/05/avd-manager.png" alt="avd manager" width="680" height="500" class="aligncenter size-full wp-image-556" /></a></p>
<p>Cliquez sur New pour créer un nouveau périphérique. Choisissez le type de Device (pour simuler mon Galaxy S, j&rsquo;ai donc choisit un 4&Prime; en 480*800). N&rsquo;oubliez pas d&rsquo;activer la prise en charge du GPU (Use Host GPU) pour que Qt puisse utiliser OpenGL ES.</p>
<p><a href="http://blog.developpez.com/gpu/files/2013/05/new-device.png"><img src="http://blog.developpez.com/gpu/files/2013/05/new-device.png" alt="new device" width="480" height="709" class="aligncenter size-full wp-image-558" /></a></p>
<p>Pour créer une application Qt, allez dans le menu Fichier puis Nouveau projet. Choisissez un projet compatible avec Android (par exemple Application Graphique Qt ou Application Qt Quick 2 (élément de base)).</p>
<p><a href="http://blog.developpez.com/gpu/files/2013/05/new-project.png"><img src="http://blog.developpez.com/gpu/files/2013/05/new-project.png" alt="new project" width="1440" height="900" class="aligncenter size-full wp-image-559" /></a></p>
<p>Dans un premier temps, le simulateur se lance.</p>
<p><a href="http://blog.developpez.com/gpu/files/2013/05/simulator.png"><img src="http://blog.developpez.com/gpu/files/2013/05/simulator.png" alt="simulator" width="481" height="827" class="aligncenter size-full wp-image-561" /></a></p>
<p>Puis l&rsquo;application à la fin du déploiement.</p>
<p><a href="http://blog.developpez.com/gpu/files/2013/05/run-simulator.png"><img src="http://blog.developpez.com/gpu/files/2013/05/run-simulator.png" alt="run simulator" width="714" height="829" class="aligncenter size-full wp-image-560" /></a></p>
<p>Pour déployer sur un téléphone (préalablement passé en mode Debug USB, voir au début), il suffit simplement de le brancher, Qt Creator lancera alors l&rsquo;application dessus.</p>
<p><a href="http://blog.developpez.com/gpu/files/2013/05/IMG_4736.jpg"><img src="http://blog.developpez.com/gpu/files/2013/05/IMG_4736.jpg" alt="IMG_4736" width="477" height="900" class="aligncenter size-full wp-image-557" /></a></p>
<h1>Conclusion</h1>
<p>Rien de très compliqué finalement. Le déploiement est relativement simple une fois que les outils sont configurés. Reste plus qu&rsquo;à tester les performances. <img src="https://blog.developpez.com/gpu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
<p>Pour ceux qui sont intéressés par Qt Quick, je rappelle le livre auquel je participe : <a href="http://www.d-booker.fr/110-qt-5-les-essentiels.html">Créer des applications avec Qt 5 &#8211; Les essentiels</a>. J&rsquo;ai en particulier participé à la rédaction de Qt Quick. C&rsquo;est encore une pré-version du livre final, mais il y a déjà pas mal de choses sur Qt Quick. Et n&rsquo;hésitez pas à me dire s&rsquo;il y a des points que vous souhaiteriez voir abordés dans ce livre.</p>
<p>Si vous êtes intéressé par Qt Quick sur mobile, je fais une présentation le 5 juin à Paris. Contactez-moi par MP pour plus d&rsquo;informations.</p>
<p>Merci à <a href="http://www.developpez.net/forums/u39401/prgasp77/">prgasp77</a> et <a href="http://www.developpez.net/forums/u329028/winjerome/">winjerome</a> pour leur relecture orthographique.</p>
<p><a href="http://www.developpez.net/forums/d1346162/qt/developpez-en-natif-pour-android-avec-qt-51/">N&rsquo;hésitez pas à commenter cet article sur le forum.</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vidéos d&#8217;installation de Qt 5</title>
		<link>https://blog.developpez.com/gpu/?p=411</link>
		<comments>https://blog.developpez.com/gpu/?p=411#comments</comments>
		<pubDate>Fri, 10 May 2013 22:29:56 +0000</pubDate>
		<dc:creator><![CDATA[gbdivers]]></dc:creator>
				<category><![CDATA[Facile]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Qt5]]></category>
		<category><![CDATA[QtQuick]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/gpu/?p=411</guid>
		<description><![CDATA[Bonjour à tous Un problème que l&#8217;on revoit souvent sur le forum est l&#8217;installation de Qt 5. J&#8217;ai réalisé, dans le cadre du livre sur Qt auquel je participe (Créer des applications avec Qt 5 &#8211; Les essentiels), plusieurs vidéos &#8230; <a href="https://blog.developpez.com/gpu/?p=411">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Bonjour à tous</p>
<p>Un problème que l&rsquo;on revoit souvent sur le forum est l&rsquo;installation de Qt 5. J&rsquo;ai réalisé, dans le cadre du livre sur Qt auquel je participe (<a href="http://www.d-booker.fr/110-qt-5-les-essentiels.html">Créer des applications avec Qt 5 &#8211; Les essentiels</a>), plusieurs vidéos pour expliquer comment installer et tester l&rsquo;installation.</p>
<p>Il y a quatre vidéos pour le moment : </p>
<ul>
<li>installation sur Windows avec Microsoft Visual C++ 2010 ;</li>
<li>installation sur Windows avec MinGW ;</li>
<li>installation sur Linux en utilisant les binaires ;</li>
<li>installation sur Ubuntu en utilisant les dépôts.</li>
</ul>
<p>Les vidéos sont disponibles sur le site de l&rsquo;éditeur : <a href="http://www.youtube.com/playlist?list=PLJ0RWFYCJZYF1pxD5FlAFqQVYkmebeTUY">D-booker.fr (YouTube)</a>.</p>
<p>Je n&rsquo;ai pas fait de prise son, donc penser à activer les sous-titres pour avoir les explications. J’essaierais de proposer prochainement d&rsquo;autres vidéos d&rsquo;installation (sur Mac, sur Raspberry Pi) ou des démos.</p>
<p>Bonne visualisation (et bonne lecture à ceux qui liront le livre ;))</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les modules de Qt 5</title>
		<link>https://blog.developpez.com/gpu/?p=25</link>
		<comments>https://blog.developpez.com/gpu/?p=25#comments</comments>
		<pubDate>Tue, 04 Sep 2012 15:24:25 +0000</pubDate>
		<dc:creator><![CDATA[gbdivers]]></dc:creator>
				<category><![CDATA[Facile]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Qt5]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/gpu/?p=25</guid>
		<description><![CDATA[L&#8217;un des principaux changements que l&#8217;on trouvera dans Qt 5 est la réorganisation des modules. Les modules sont regroupés en deux groupes : les Essentials, installés automatiquement, et les Add-ons, installés à la demande. Puisque Qt 5 n’est pas encore &#8230; <a href="https://blog.developpez.com/gpu/?p=25">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>L&rsquo;un des principaux changements que l&rsquo;on trouvera dans Qt 5 est la réorganisation des modules. Les modules sont regroupés en deux groupes : les <em>Essentials</em>, installés automatiquement, et les <em>Add-ons</em>, installés à la demande. Puisque Qt 5 n’est  pas encore en version finale, les informations données dans cet article sont susceptibles d&rsquo;être modifiées.<br />
<span id="more-25"></span></p>
<h1>Les modules Essentials</h1>
<h2>Le module Qt Core</h2>
<p>Ce module fournit les fonctionnalités de base de Qt, excepté ce qui concerne l&rsquo;interface graphique. Tous les autres modules sont liés à ce module. Voici la liste de quelques ajouts dans Qt 5 :</p>
<ul>
<li><em>QStandardPaths</em> : permet de récupérer les répertoires par défaut en fonction de la plateforme. C&rsquo;est une évolution de <em>QDesktopServices</em> avec plus de fonctionnalités, sur le modèle de KStandardDirs de KDE. Cela permet par exemple de faire une recherche de toutes les occurrences d&rsquo;un fichier dans les différents répertoires ;</li>
<li>support de JSON : permet de créer ou de lire un fichier JSON à partir d&rsquo;une représentation binaire en mémoire ;</li>
<li>extension prise en charge MIME : permet de déterminer le type mime d&rsquo;un fichier ou de données en mémoire, en fonction de l&rsquo;extension et/ou du contenu. Ce module utilise une base de données des types MIME par <em>QMimeDatabase</em> fourni par freedesktop.org shared-mime-info project. Cette base de données est incluse par défaut dans le système sous Linux et fourni par Qt sur Windows et Mac OS X ;</li>
<li>vérification des connexions signaux/slots à la compilation : vérifie l&rsquo;existence du signal et du receveur et que les arguments sont compatibles. Cette fonctionnalité utilise les templates et est compatible avec C++11. Il est possible de connecter un signal à des fonctions lambda, des fonctions membres ou des fonctions statiques, sans avoir besoin de déclarer comme slots. Voir l&rsquo;article détaillé sur le sujet : <a href="http://blog.developpez.com/gpu/p10958/langages-frameworks/c/les_signaux_et_slots_dans_qt5" target="_blank">Les signaux et slots dans Qt 5</a> ;</li>
<li><em>QRegularExpression</em> : nouveau moteur d&rsquo;expressions régulières compatible Perl, plus puissante et rapide que <em>QRegExp</em>, avec plus de fonctionnalités (lazy and possessive quantifiers, lookbehinds, named capturing groups and iteration of matches) ;</li>
<li>amélioration des performances, en particulier pour les structures de données ;</li>
<li>amélioration du support C++11 quand c&rsquo;est possible (mais compatibilité avec C++98) ;</li>
<li>support des boutons supplémentaires sur les souris (souris pour joueurs), jusque 27 boutons pour XCB, XLIB ou DirectFB, jusque 16 pour Wayland, Evdev ou OS-X, jusque 8 pour BlackBerry/QNX et 5 sur Windows (limitation due au système).</li>
</ul>
<h2>Le module Qt Gui</h2>
<p>Ce module fournit les fonctionnalités de base pour créer une interface utilisateur. Les anciennes classes <em>QWidget</em> et dérivées sont séparées dans un module indépendant. Ce module contient de nouvelles classes comme  <em>QWindow</em>, <em>QScreen</em>, <em>QSurfaceFormat</em> permettant le support de fonctionnalités de base et est surtout destiné à être utilisé par les autres modules (QWidget, QQuickView, Qt 3D View, etc.).<br />
En particulier, ce module fournit les classes <em>QOpenGLxxx</em> (<em>QOpenGLFramebufferObject</em>, <em>QOpenGLShaderProgram</em>, <em>QOpenGLFunctions</em>, <em>QOpenGLContext</em>, etc.) permettant de fournir l&rsquo;accélération matérielle pour tous les modules graphiques (widgets traditionnels, Qt Quick). La classe <em>QOpenGLContext</em> est plus générique que <em>QGLContext</em> et est découplée de <em>QWindow</em>, pour permettre d&rsquo;utiliser un contexte commun pour plusieurs affichages. <em>QOpenGLPaintDevice</em> permet d&rsquo;utiliser directement <em>QPainter</em> sur un contexte OpenGL sans devoir dériver de <em>QWindow</em> ou <em>QOpenGLFramebufferObject</em>.<br />
Voir l&rsquo;article <a href="http://blog.developpez.com/gpu/p10904/langages-frameworks/opengl/opengl_dans_qt5" target="_blank">OpenGL dans Qt 5</a> pour plus de détails.</p>
<h2>Le module Qt QML</h2>
<p>Ce module permet d&rsquo;utiliser le langage de script déclaratif QML grâce au <em>QML engine</em>. Il présente des améliorations des performances et des ajouts de fonctionnalités par rapport celui inclus dans Qt 4.</p>
<h2>Le module Qt Js backend (JavaScript)</h2>
<p>Ce module fournit un interpréteur JavaScript, permettant de scripter les applications écrites en C++ et en QML. Il utilise un nouveau moteur <a href="http://code.google.com/p/v8/" target="_blank">JS v8</a> plus rapide. Il inclut de nouvelles classes (<em>QJSEngine</em>, <em>QJSValue</em>), le support de nouveaux types (<em>QColor</em> avec les propriétés r, g, b et a, <em>QVector4D</em> constructible avec Qt.vector4d()). Il est possible d&rsquo;ajouter des fonctionnalités dans un namespace avec la fonction qmlRegisterModuleApi et d&rsquo;importer du QML et du JS directement dans un fichier JS.</p>
<h2>Le module Qt Quick</h2>
<p>Ce module permet de créer des interfaces dynamiques riches, en utilisant les modules QML et le JS. Cette nouvelle version de Qt Quick correspond au module &laquo;&nbsp;qtquick2&Prime; alors que l&rsquo;ancienne version correspond au module &laquo;&nbsp;qtquick1&Prime;. L&rsquo;interface graphique de Qt Quick 2 se base maintenant sur scenegraph et permet l&rsquo;accélération matérielle en utilisant les classes <em>QOpenGLxxx</em> de Qt Gui.<br />
On trouve de nouvelles classes (<em>QQuickView</em>, <em>QQuickCanvas</em>, <em>QQuickItem</em> et <em>QQuickPaintedItem</em> qui remplacent les classes équivalentes de <em>QDeclarative</em>), de nouveaux items (<em>Canvas</em> permet le support de l&rsquo;API <em>Context2D</em> de HTML 5, le rendu est réalisé dans Canvas.Image et Canvas.FramebufferObject, avec support multithread en arrière-plan). Le moteur de particules 2D Qt Quick.Particles 2.0 et la collection d&rsquo;effets de shaders qui étaient avant des projets séparés dans Qt Labs sont maintenant inclus dans Qt.</p>
<h2>Le module Qt 3D</h2>
<p>Le module Qt 3D est également un ancien projet provenant de Qt Labs et est inclus dans Qt 5. Il a permis dans Qt 4 l&rsquo;ajout de nombreuses fonctionnalités de calculs 3D comme les classes <em>QMatrix4×4</em>, <em>QGLShaderProgram</em> et <em>QVector3D</em>. Il utilise en interne le module Qt QML et le support OpenGL de Qt Gui. Ce module contient deux bibliothèques : Qt 3D (pour utiliser directement la 3D en C++) et Qt 3D Quick (pour l&rsquo;utilisation dans Qt Quick).</p>
<p>Plusieurs fonctionnalités sont ajoutées :</p>
<ul>
<li>gestion de scènes 3D, avec rendu en OpenGL ;</li>
<li>lecture de fichiers 3D (par exemple .obj et .3ds) ;</li>
<li>gestion des lumières, des meshs, des textures, des matériaux, des animations, des caméras, des vues ;</li>
<li>ajout de shader directement ou par fichier dans les propriétés QML ;</li>
</ul>
<h2>Le module Qt Location</h2>
<p>Ce module est un ajout dans Qt 5, mais il existait déjà depuis des années comme sous-ensemble de Qt Mobility. Il fournit les services nécessaires pour la localisation : GPS, cartographie, etc.<br />
Il inclut une fonctionnalité permettant d&rsquo;afficher des cartes avec <em>MapQuickItem</em>. L&rsquo;affichage se base sur une approche modèle/vue et bénéficie de l&rsquo;accélération OpenGL dans scenegraph. Les gestuelles pour les zooms et les panoramas dynamiques, le routage et le géocodage, l&rsquo;ajout de repères sur les cartes sont pris en charge.</p>
<h2>Le module Qt Network</h2>
<p>Ce module fournit une interface portable pour utiliser les réseaux. Parmi les évolutions :</p>
<ul>
<li>amélioration du support IPv6 et des réseaux utilisant les types d’adresse IP, de manière transparente par défaut. En réception, QTcpServer et QUdpSocket lancés avec QHostAddress::Any permet de recevoir dans les deux modes ; avec QHostAddress::AnyIPv4 et QHostAddress::AnyIPv6 permet de travailler sur un mode uniquement. En émission, QNetworkAccessManager tente d&rsquo;utiliser les deux modes et garde le premier qui réussit ;</li>
<li>QTcpSocket peut maintenant être attaché à un socket existant avant de lancer une connexion, pour limiter les connexions dans un environnement multihôte ;</li>
<li>QDnsLookup permet de rechercher des enregistrements DNS. Il ne remplace pas QHostInfo, qui permet de résoudre les noms en adresse IP, mais permet principalement d&rsquo;utiliser les autres types d&rsquo;enregistrements DNS : SRV, TXT et MX ;</li>
<li>les classes QFtp et QHttp ne sont pas conservées dans ce module, mais restent disponibles dans un module indépendant pour la compatibilité. Elles sont remplacées par QNetworkAccessManager.</li>
<li>extensions et vérifications des certificats SSL : prise en charge des extensions des certificats. La vérification des certificats ne se fait plus uniquement lors de la connexion à un serveur ;</li>
<li>support des clés privées masquées : permet de lire une clé privée à partir d&rsquo;un périphérique, par exemple un dongle PKCS#11.</li>
</ul>
<h2>Les autres modules</h2>
<ul>
<li>Qt Multimedia : fournit les fonctionnalités de base pour lire l&rsquo;audio, la vidéo, la radio et gérer les caméras ;</li>
<li>Qt SQL : fournit une prise en charge portable des bases de données SQL ;</li>
<li>Qt Test : fournit les outils nécessaires pour implémenter des tests unitaires ;</li>
<li>Qt WebKit : basé sur WebKit 2, mais sans changement de l&rsquo;API C++. Ce module continue l&rsquo;amélioration de prise en charge HTML 5 et des performances.</li>
</ul>
<h1>Les modules Add-ons</h1>
<h2>Le module Qt Widget</h2>
<p>Ce module fournit l&rsquo;ensemble des classes QWidget et dérivées pour la compatibilité avec Qt 4. Il utilise la nouvelle architecture <a href="http://qt-project.org/wiki/Qt-Platform-Abstraction" target="_blank">Qt Platform Abstraction</a> (QPA).</p>
<h2>Le module Qt Quick 1</h2>
<p>Ce module permet d&rsquo;utiliser la version de Qt Quick disponible dans Qt 4, pour compatibilité. Pour utiliser ce module, il suffit d&rsquo;ajouter dans le .pro :</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">QT += quick1</div></td></tr></tbody></table></div>
<p>Et d&rsquo;inclure les fichiers d&rsquo;en-têtes :</p>
<div class="codecolorer-container cpp blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="cpp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #339900;">#include QtQuick1/QDeclarativeView</span><br />
<span style="color: #339900;">#include QtQuick1/QDeclarativeItem</span></div></td></tr></tbody></table></div>
<h2>Les autres modules</h2>
<ul>
<li>Qt Script : permet de rendre les applications scriptables, compatibilité avec Qt 4. Il utilise les classes QJSxxx du module Qt Js ;</li>
<li>Qt Bluetooth : prise en charge du Bluetooth ;</li>
<li>Qt D-Bus : interprocessus communication avec D-Bus ;</li>
<li>Qt Graphical Effects : collection d&rsquo;effets graphiques ;</li>
<li>Qt Image Formats : prise en charge de formats d&rsquo;images supplémentaires (TIFF, MNG, TGA, WBMP) ;</li>
<li>Qt OpenGL : module 3D OpenGL compatible avec Qt 4 ;</li>
<li>Qt Print Support : support pour l&rsquo;impression ;</li>
<li>Qt Publish and Subscribe ;</li>
<li>Qt Script Tools : outils supplémentaires pour scripter ;</li>
<li>Qt Sensor : gestion des capteurs (accéléromètre, détecteur de lumière ambiante, compas, etc.) ;</li>
<li>Qt Service Framework : permet de fournir des services en ligne ;</li>
<li>Qt SVG : prise en charge du format d&rsquo;image SVG (image vectorielle) ;</li>
<li>Qt System Info : informations sur le système (profile utilisateur, batterie, stockage, etc.) ;</li>
<li>Qt Tools : outils divers (Qt Designer, Qt Help, etc.) ;</li>
<li>Qt Pim : contacts, organiseur, vCard, etc. ;</li>
<li>Qt WebKit Widgets : version de wekbit 1, pour compatibilité avec Qt 4 ;</li>
<li>Qt XML : fichier XML avec SAX et DOM. Ce module est déprécié, il faut maintenant utiliser QXmlStreamReader/Writer ;</li>
<li>Qt XML Patterns : support pour XPath, XQuery, XSLT et XML Schema validation.</li>
</ul>
<h1>Les modules accessoires</h1>
<p>Le support de ces modules n&rsquo;est pas encore déterminé.</p>
<ul>
<li>Active Qt : support des ActiveX et Com (Windows) ;</li>
<li>Qt Feedback ;</li>
<li>Qt JSON DB ;</li>
<li>Phonon : support du framework phonon pour la vidéo et audio ;</li>
<li>Qt QA : auto test, pour gestion automatique des tests ;</li>
<li>Qt QLALR : interpréteur LALR.</li>
</ul>
<h1>Commentaires et remerciements</h1>
<p><a href="http://www.developpez.net/forums/d1259378/c-cpp/bibliotheques/qt/vue-densemble-larchitecture-modulaire-qt-5-a/" target="_blank">Vous pouvez commenter cet article sur le forum</a>.<br />
Merci à <a href="http://www.developpez.net/forums/u124512/claudeleloup/">ClaudeLELOUP</a> pour sa relecture orthographique.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenGL dans Qt5</title>
		<link>https://blog.developpez.com/gpu/?p=11</link>
		<comments>https://blog.developpez.com/gpu/?p=11#comments</comments>
		<pubDate>Tue, 29 May 2012 08:55:39 +0000</pubDate>
		<dc:creator><![CDATA[gbdivers]]></dc:creator>
				<category><![CDATA[Facile]]></category>
		<category><![CDATA[OpenGL]]></category>
		<category><![CDATA[Qt5]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le support d&#8217;OpenGL dans Qt5 a été modifié pour mieux l&#8217;intégrer avec les nouveaux modules de Qt : QtQuick2 et Qt3D. Cet article présente les modifications apportées dans Qt5. OpenGL dans Qt4 Dans Qt4, les fonctionnalités d&#8217;OpenGL sont implémentées dans &#8230; <a href="https://blog.developpez.com/gpu/?p=11">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Le support d&rsquo;OpenGL dans Qt5 a été modifié pour mieux l&rsquo;intégrer avec les nouveaux modules de Qt : QtQuick2 et Qt3D. Cet article présente les modifications apportées dans Qt5.<br />
<span id="more-11"></span><br />
<strong><em>OpenGL dans Qt4</em></strong></p>
<p>Dans Qt4, les fonctionnalités d&rsquo;OpenGL sont implémentées dans un module spécifique, QtOpenGL. Ce module était utilisé par différentes classes pour bénéficier de l’accélération matérielle. Il existe plusieurs méthodes pour activer l&rsquo;accélération matérielle :</p>
<ul>
<li>pour activer par défaut l&rsquo;utilisation de OpenGL, utiliser la ligne de commande &laquo;&nbsp;-graphicssystem opengl&nbsp;&raquo; ou la fonction QApplication::setGraphicsSystem(&laquo;&nbsp;opengl&nbsp;&raquo;) ;</li>
<li>pour QGraphicsView (QtGraphics) ou QDeclarativeView (QtQuick), utiliser la fonction setViewport(new QGLWidget) ;</li>
<li>on peut également utiliser QPainter directement sur un QGLWidget ;</li>
<li>avec le QML Viewer, utilisez la commande &laquo;&nbsp;-opengl&nbsp;&raquo;.</li>
</ul>
<p><em><strong>L&rsquo;organisation des modules</strong></em><br />
Dans Qt4, on a donc un problème dans l&rsquo;organisation des modules. Beaucoup de classes de QtGui peuvent dépendre des classes appartenant à QtOpenGL alors que ce module dépend normalement de QtGui.<br />
C&rsquo;est pour cela que de nouvelles classes font leur apparition dans Qt5 et que les différents modules ont été réorganisés :</p>
<ul>
<li>les classes QOpenGL appartiennent au module QtGui et fournissent les fonctionnalités de base permettant l’accélération matérielle pour toute les classes de rendu de Qt ;</li>
<li>la classe QWidget n&rsquo;est plus le parent de toutes les classes de rendu. Cette classe et ses dérivées (QGraphicsView) sont transférées dans le module &laquo;&nbsp;widgets&nbsp;&raquo; ;</li>
<li>QtQuick 2 utilise maintenant scenegraph à la place de QWidget et la classe QDeclarativeView devient QQuickView et OpenGL est utilisé par défaut ;</li>
<li>QtOpenGL continue d&rsquo;exister pour fournir la classe QGLWidget et ses dérivés. Le code OpenGL Qt4 est donc compatible avec Qt5 ;</li>
<li>le module Qt3d fait son apparition pour fournir un moteur 3D plus avancé. Ce module est suffisamment important et fera donc l&rsquo;objet d&rsquo;un article spécifique.</li>
</ul>
<p>Remarque : il faut faire attention de ne pas confondre le module QtOpenGL, contenant les classes commençant par QGL, et le module QtGui, contenant les classes commençant par QOpenGL (sans t).</p>
<p><strong><em>Les classes de QtGui dans Qt5</em></strong><br />
Le module QtGui de Qt5 réutilise des classes existantes du module QtOpenGL de Qt4. Les noms sont explicites :</p>
<ol>
<li>QOpenGLBuffer ;</li>
<li>QOpenGLContext ;</li>
<li>QOpenGLFramebufferObject ;</li>
<li>QOpenGLFramebufferObjectFormat ;</li>
<li>QOpenGLShader ;</li>
<li>QOpenGLShaderProgram.</li>
</ol>
<p>Plusieurs nouvelles classes font leur apparition :</p>
<ol>
<li>QOpenGLContextGroup : groupe de contextes OpenGL pouvant partager des ressources. Cette classe est gérée automatiquement par les objets QOpenGLContext ;</li>
<li>QOpenGLFunctions : fournit un accès indépendant de la plateforme aux fonctions d&rsquo;OpenGL ;</li>
<li>QOpenGLPaintDevice : permet de dessiner dans un contexte OpenGL avec QPainter ;</li>
<li>QOpenGLStaticContext : manque de documentation ;</li>
<li>QOpenGLContextData : manque de documentation ;</li>
<li>QWindowsGLContext : manque de documentation.</li>
</ol>
<p><strong><em>Que faut-il modifier pour utiliser OpenGL dans Qt5</em></strong><br />
Tout d&rsquo;abord, il faut Qt5. Le plus simple est d&rsquo;utiliser les dépôts PPA sur Ubuntu : https://launchpad.net/~forumnokia/+archive/fn-ppa. Qt5 sera installé dans le répertoire /opt/qt5. Pour ajouter cette version de Qt dans QtCreator, il faut aller dans le menu &laquo;&nbsp;Outils&nbsp;&raquo; puis &laquo;&nbsp;Options…&nbsp;&raquo;, allez dans &laquo;&nbsp;Compiler et exécuter…&nbsp;&raquo; puis l&rsquo;onglet &laquo;&nbsp;Versions de Qt&nbsp;&raquo;. Cliquer sur &laquo;&nbsp;Ajouter&nbsp;&raquo; et aller chercher le fichier &laquo;&nbsp;/opt/qt5/bin/qmake&nbsp;&raquo;. Voilà, Qt5 est prêt à être utilisé.</p>
<p>Normalement, vous pouvez utiliser vos projets directement, mais il est préférable de prendre l&rsquo;habitude d&rsquo;ajouter le module &laquo;&nbsp;widgets&nbsp;&raquo; (remarque : l&rsquo;ajout des modules core et gui n&rsquo;est pas obligatoire puisqu&rsquo;ils sont inclus par défaut) :</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">QT += core gui opengl <br />
greaterThan(QT_MAJOR_VERSION, 4) { <br />
&nbsp; &nbsp; QT += widgets <br />
}</div></td></tr></tbody></table></div>
<p>Amusez-vous bien !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Les signaux et slots dans Qt5</title>
		<link>https://blog.developpez.com/gpu/?p=12</link>
		<comments>https://blog.developpez.com/gpu/?p=12#comments</comments>
		<pubDate>Wed, 25 Apr 2012 15:19:18 +0000</pubDate>
		<dc:creator><![CDATA[gbdivers]]></dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Qt5]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[La nouvelle version de Qt vient de sortir en version 5 alpha. Cette version améliore la prise en charge de la nouvelle norme du C++, le C++11, et modifie ainsi le fonctionnement des signaux et slots de Qt. Cet article &#8230; <a href="https://blog.developpez.com/gpu/?p=12">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>La nouvelle version de Qt vient de sortir <a href="http://www.developpez.net/forums/d1209764/c-cpp/bibliotheques/qt/sortie-qt-5-alpha/">en version 5 alpha</a>. Cette version améliore la prise en charge de la nouvelle norme du C++, le C++11, et modifie ainsi le fonctionnement des signaux et slots de Qt. Cet article fait un rappel sur l&rsquo;utilisation des signaux et slots et présente les nouvelles fonctionnalités offertes par Qt5.<br />
<span id="more-12"></span><br />
<strong><em>Couplage entre classes et intérêt des signaux et slots</em></strong></p>
<p>Lorsque l&rsquo;on souhaite faire communiquer des objets entre eux, il nécessaire en général que les objets se connaissent mutuellement. Par exemple</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class Receiver { <br />
public: <br />
&nbsp; &nbsp; void slot() { cout &amp;lt;&amp;lt; &amp;quot;slot exécuté&amp;quot; &amp;lt;slot(); } <br />
private: <br />
&nbsp; &nbsp; Receiver* receiver; <br />
}; <br />
&nbsp;<br />
int main() { <br />
&nbsp; &nbsp; // on crée nos objets <br />
&nbsp; &nbsp; Receiver r; <br />
&nbsp; &nbsp; Sender s; <br />
&nbsp;<br />
&nbsp; &nbsp; // on connecte le sender et le receiver <br />
&nbsp; &nbsp; s.connect(&amp;amp;r); <br />
&nbsp;<br />
&nbsp; &nbsp; // on émet le signal <br />
&nbsp; &nbsp; s.signal(); <br />
}</div></td></tr></tbody></table></div>
<p>Ce code présente cependant plusieurs problèmes :</p>
<ul>
<li>il faut que la classe Sender connaisse la classe Receiver et cela implique d&rsquo;ajouter une dépendance (include) entre ces classes ;</li>
<li>il est nécessaire de créer une fonction spécifique dans Sender pour chaque type de classe Receiver et pour chaque slot possible ;</li>
<li>il ne permet pas de gérer des connexions vers plusieurs objets Receiver et il faut modifier le code pour gérer une liste de Receiver.</li>
</ul>
<p>Ces contraintes s&rsquo;accumulent dans un framework complexe comme Qt et cela alourdit fortement le code en ajoutant un nombre important de dépendances inutiles. Le code devient très vite ingérable (*).</p>
<p>Le système des signaux et slots permet de faire de s&rsquo;affranchir de ces contraintes. Il est ainsi possible de faire communiquer des objets entre eux sans qu&rsquo;il soit nécessaire que ces objets se connaissent mutuellement. On peut également choisir lors de la connexion le slot que l&rsquo;on souhaite appeler lorsque le signal est émis. On passe ainsi d&rsquo;un couplage fort (nécessité d&rsquo;avoir une dépendance) à un couplage faible (plus de dépendance nécessaire) et l&rsquo;on parle de découplage des classes.</p>
<p><em>(*) Il est possible d&rsquo;utiliser d&rsquo;autres approches que celle présentée ici. En particulier, on peut utiliser les pointeurs de fonctions ou équivalents (callback). Le lecteur intéressé par la question pourra par exemple étudier l&rsquo;approche utilisée dans <a href="http://www.boost.org/doc/libs/1_49_0/doc/html/signals.html">Boost.Signals</a></em></p>
<p><em><strong>Le système des signaux et slots dans Qt</strong></em></p>
<p>Le système de signaux et slots de Qt est relativement simple. Lorsqu&rsquo;un événement se produit, un signal est émis. Tous les slots qui sont connectés à ce signal sont alors exécutés. La fonction QObject::connect permet de créer une telle connexion. La forme la plus classique de cette fonction prend en paramètres un pointeur vers l&rsquo;objet émetteur, le nom du signal (ainsi que la liste des types des arguments du signal), un pointeur vers l&rsquo;objet recepteur et pour terminer le nom du slot (ainsi que la liste des types des arguments du slot). Il est possible de connecter plusieurs signaux à un même slot, un signal à plusieurs slots ou un signal avec un signal. Le compatibilité entre les classes et les signaux et slots est vérifiés lors de la compilation.</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">QAction a; <br />
QWidget w; <br />
QObject::connect( <br />
&nbsp; &nbsp; &amp;amp;a, SIGNAL(triggered()), // connecte le signal triggered() de QAction <br />
&nbsp; &nbsp; &nbsp; &amp;amp;w, SLOT(show())); &nbsp; &nbsp; &nbsp; // au slot show() de QWidget <br />
// ce code permet donc d'afficher le QWidget lorsque l'utilisateur active la QAction</div></td></tr></tbody></table></div>
<p><img src="http://doc-snapshot.qt-project.org/5.0/images/abstract-connections.png" alt="Exemple de connexions dans Qt" title="Exemples de connexions dans Qt" /></p>
<p>Les classes de Qt fournissent de nombreux signaux et slots par défaut. Ces signaux et slots seront disponibles dans les classes créées par les utilisateurs et dérivant des classes de Qt. Il est également possible de créer ses propres signaux et slots et de les connecter aux signaux et slots par défaut de Qt :</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#include &nbsp;<br />
&nbsp;<br />
class Counter : public QObject // on hérite de QObject pour bénéficier des méta-informations de Qt <br />
{ <br />
&nbsp; &nbsp;Q_OBJECT // cette macro permet de générer les signaux et slots lors de la compilation <br />
&nbsp;<br />
public slots: <br />
&nbsp; &nbsp;void setValue(int value) <br />
&nbsp; &nbsp;{ <br />
&nbsp; &nbsp; &nbsp; if (value != m_value) // lorsque la valeur est changée <br />
&nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_value = value; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;emit valueChanged(value); // on émet un signal valueChanged <br />
&nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp;} <br />
&nbsp;<br />
signals: <br />
&nbsp; &nbsp; void valueChanged(int newValue); // signal émis lorsque la valeur est changée <br />
&nbsp;<br />
private: <br />
&nbsp; &nbsp; int m_value; <br />
}; <br />
&nbsp;<br />
Counter a, b; <br />
&nbsp;<br />
// on connecte valueChanged de a à setValue de b <br />
QObject::connect(&amp;amp;a, &amp;amp;Counter::valueChanged, &amp;amp;b, &amp;amp;Counter::setValue); <br />
&nbsp;<br />
a.setValue(12); &nbsp;<br />
// a émet un signal valueChanged qui active le slot setValue de b <br />
// a.value() == 12, b.value() == 12 <br />
&nbsp;<br />
b.setValue(48); &nbsp; &nbsp; &nbsp;<br />
// b émet un signal valueChanged mais ce signal n'est pas connecté à un slot <br />
// a.value() == 12, b.value() == 48</div></td></tr></tbody></table></div>
<p><em><strong>Créer une connexion dans Qt 5</strong></em></p>
<p>Dans Qt 4, il est possible de connecter uniquement les fonctions déclarées comme signaux et<br />
slots dans la classes, comme indiqué dans le code d&rsquo;exemple précédant. Dans Qt 5, il est<br />
maintenant possible de connecter directement des pointeurs de fonctions ou d&rsquo;utiliser des<br />
fonctions lambdas.</p>
<p>La connexion de pointeurs de fonctions est similaire à une connexion classique, en donnant un pointeur sur les objets et sur les fonctions. Les classes émettrices et réceptrices doivent dériver de QObject mais il n&rsquo;est pas nécessaire de déclarer les fonctions slots avec le mot clé &laquo;&nbsp;slots&nbsp;&raquo;.</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class Sender : public QObject { <br />
&nbsp; &nbsp; Q_OBJECT <br />
&nbsp;<br />
signals: <br />
&nbsp; &nbsp; void send(int i = 0); <br />
}; <br />
&nbsp;<br />
class Receiver : public QObject { <br />
&nbsp;<br />
public: <br />
&nbsp; &nbsp; void receive(int i = 0) { std::cout &amp;lt;&amp;lt; &amp;quot;receive:&amp;quot; &amp;lt;&amp;lt; i &amp;lt;send(123);</div></td></tr></tbody></table></div>
<p>L&rsquo;avantage de cette écriture est que la compatibilité des paramètres est effectuée lors de la compilation et non lors de l’exécution. </p>
<p>Pour les fonctions lambdas :</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">// connexion avec les lambdas <br />
QObject::connect(s, &amp;amp;Sender::send, [r](int i = 0){ r-&amp;gt;receive(i); }); <br />
emit s-&amp;gt;send(456);</div></td></tr></tbody></table></div>
<p>Dans ce code, on capture le pointeur vers l&rsquo;objet recepteur et on récupère le paramètre passé par la fonction send() puis on appelle dans le corps de la lambda le fonction receive(). Le résultat obtenu est identique au code précédant, mais il est possible de faire beaucoup d&rsquo;autres choses dans la lambda (par exemple déconnecter tous le signaux ou parcourir tous les enfants de l&rsquo;objet récepteur).</p>
<p>Si le compilateur utilisé ne support pas les variadic template, les signaux et slots doivent avoir moins de 6 paramètres. </p>
<p><em><strong>Remarques</strong></em><br />
Vous pouvez télécharger un projet d&rsquo;exemple montrant ces nouvelles fonctionnalités en action : <a href="http://cpp.developpez.com/telecharger/detail/id/2744/-Qt-5-Les-nouvelles-possibilites-de-connexions-signaux-slots-dans-Qt-5">la page de téléchargement</a>.</p>
<p>Les images et codes d&rsquo;exemple sont issus de la documentation de Qt5 disponible à cette page : <a href="http://qt-project.org/doc/qt-5.0/qtcore/signalsandslots.html#signals-and-slots">Qt 5.0: Signals &amp; Slots</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
