Documente Academic
Documente Profesional
Documente Cultură
Ici, l'équipe rédactionnelle souhaiterait remercier tous ceux qui ont contribué à cette
FAQ : Amnell, Alp, Aurélien Régat-Barrel, dourouc05, frifri59, Gulish, haraendil,
Ikipou, IrmatDen, johnlamericain, Kinji1, LeGars, LittleWhite, Mac&Cheese,
Matthieu Brucher, Niak74, nouknouk, Nykoo, Shugo78, superjaja, yan.
Ont contribué à cette FAQ :
-3-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
-4-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
-5-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• commercial : vous permet de faire ce que vous voulez avec le code de Qt et votre code.
• GPL V3 : tout code développé avec la version GPL de Qt doit aussi être GPL. Tout le code doit donc être
accessible aux utilisateurs de l'application. C'est la licence généralement choisie pour les projets Open Source.
• LGPL v2.1 : similaire à la GPL, mais si Qt est lié dynamiquement à votre application, le code de votre
application peut être fermé/propriétaire. Les modifications sur les sources de Qt seront obligatoirement LGPL.
Avec cette licence, l'utilisateur doit avoir la possibilité de remplacer Qt par sa propre version. Cela n'est
généralement un problème que lorsque Qt est intégré directement dans un appareil (télévision, GPS, etc.).
Où trouver la documentation de Qt ?
Auteurs : Alp Mestan ,
Une documentation officielle plus qu'exhaustive pour chacune des versions de Qt est proposée par Noki. Le sommaire
de toutes ces documentations se trouve ici : Online Reference Documentation
De plus, chaque version de Qt est distribuée avec un outil permettant de parcourir la documentation : Qt Assistant. La
version de la documentation accessible avec Qt Assistant correspond à la version de Qt avec laquelle il a été distribué.
La rédaction Qt de Développez vous propose la traduction de certains articles, leur nombre augmentera
régulièrement.
Ces articles sont écrits par des professionels de Qt, qui ont de l'expérience avec ce framework : ces sommités nous font
part de leur expérience dans le domaine, pour simplifier le développement et pour éviter des erreurs courantes.
Pour que la compilation se déroule correctement, il faut que le chemin vers les en-têtes de Qt soit inclus dans la liste des
dossiers à parcourir pour les en-têtes, mais aussi chacun des sous-dossiers des bibliothèques que vous utiliserez.
-6-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Enfin, il faut savoir que pour chaque classe de Qt, il existe un en tête qui porte le même nom que la classe. Si par exemple
vous utilisez QString, il faut un include de ce genre.
#include <QString>
Par défaut, les fichiers d'en-tête se trouvent dans les frameworks sous Mac OS X (/Library/Frameworks), dans
les includes sous Linux (généralement dans /usr/include/qt4), et dans le repertoire où Qt est installé sous Windows
(généralement dans C:\Qt\4.x.x\include). Pour compiler une application Qt, vous pouvez utiliser qmake, qui définira
ces chemins pour vous.
Sur ces bases, un bon départ est de lire (et appliquer !) les tutoriels Débuter dans la création d'interfaces graphiques
avec Qt 4 et Carnet d'adresses. Qt introduit de nombreux concepts pour faciliter la programmation graphique, et lire le
tutoriel peut vous être utile, même si vous avez déjà utilisé une bibliothèque graphique.
Pour essayer les exemples du tutoriel, il faut un environnement de développement configuré pour utiliser Qt. Le plus
simple pour commencer est d'utiliser le Qt SDK (Qt avec un EDI, QtCreator, et un compilateur, MinGW) ou d'installer
Qt et d'utiliser Monkey Studio ou QDevelop.
Lorsque vous avez acquis les concepts du tutoriel, vous pouvez continuer avec les exemples de Qt. Chaque version de
Qt est distribuée avec un logiciel nommé QtDemo, celui-ci est rempli d'exemples avec leur code source.
-7-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Comme vous pouvez le voir, il est très simple de gérer ses composants. Pour en découvrir plus, il est bon de consulter la
documentation et les exemples de Nokia, ainsi que les tutoriels et la traduction de la documentation officielle présents
sur la rubrique Qt de Développez.com.
-8-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Pour cela, les développeurs de Qt utilisent le gestionnaire de versions Git, et, plus particulièrement, Gitorious, qui
héberge des projets utilisant git gratuitement. Il est également possible d'utiliser ce site pour vos propres projets.
La méthode pour contribuer est la suivante (l'utilisation du protocole Git ne sera pas détaillée, assez complexe et
nécessitant dédié).
lien : Gitorious
lien : Qt sur Gitorious
lien : Documentation de Git
Contribuer à QtWebkit est un peu différent de la manière de contribuer à Qt. Les contributions sont un peu plus
difficiles que pour Qt, car le dépôt est partagé avec Google et Apple.
-9-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• Si le patch est prêt pour review, il faut choisir "?" dans le champ Review du patch.
Le wiki de Webkit fournit aussi quelques informations sur les contributions à Qt.
Les reviews sont rarement accordées la première fois. Les développeurs de Webkit sont extrêmement pointilleux sur :
• La présence de tests unitaires,
• Les conventions de codage, légèrement différentes des conventions de Qt.
- 10 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• QtCore, qui contient les éléments essentiels du fonctionnement de toutes les bibliothèques Qt ;
• QtGui, qui contient les éléments essentiels graphiques pour les autres bibliothèques Qt ;
• QtMultimedia, contenant les lasses pour les fonctionnalités multimédia de bas niveau ;
• QtNetwork, contenant des classes dédiées à la programmation réseau ;
• QtOpenGL, permettant le support d'OpenGL ;
• QtOpenVG, permettant le support d'OpenVG ;
• QtScript, permettant d'exécuter des scripts Qt Script ;
• QtScriptTools, contenant des composants additionnels pour Qt Script ;
• QtSql, permettant l'intégration de bases de données dans Qt ;
• QtSvg, permettant la lecture et l'écriture de fichiers SVG ;
• QtXml, contenant les classes utiles à la lecture et à l'écriture de fichiers XML ;
• QtXmlPatterns, un moteur XQuery & XPath pour le XML et les modèles de données personnalisés ;
• QtDeclarative, un moteur pour la construction d'interfaces utilisateurs déclaratives fluides ;
• Phonon, qui contient les classes du framework multimédia Phonon ;
• Qt3Support, permettant de réutiliser presque de manière transparente les anciennes classes de Qt3 ;
• QtDesigner, permettant l'extension de QtDesigner ;
• QtUiTools, permettant l'utilisations des fichier .ui de QtDesigner dans des applications ;
• QtHelp, permettant d'utiliser le système d'aide de Qt ;
• QtTest, contenant des outils permettant de réaliser des tests unitaires ;
• QAxContainer, extension pour l'accès aux contrôles ActiveX ;
• QAxServer, extension pour écrire des serveurs ActiveX ;
• QtDBus, contenant des classes pour la communication inter-processus avec D-Bus.
Chaque bibliothèque peut être ajoutée ou retirée des projets Qt, sachant que QtCore et QtGui sont ajoutées par défaut.
Voici les modules de Qt ainsi que la valeur à ajouter à QT si vous les utilisez.
- 11 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• opengl : QtOpenGL
• script : QtScript
• scripttools : QtScriptTools
• phonon : Phonon
• sql : QtSql
• svg : QtSvg
• xml : QtXml
• xmlpatterns : QtXmlPatterns
• declarative : QtDeclarative
• webkit : QtWebkit
• qt3support : Qt3Support
• designer : QtDesigner
• uitools : QtUiTools
• help : QtHelp
• qtestlib : QtTest
• dbus : QtDbus
Pour savoir quel module contient la classe Qt que vous souhaitez utiliser, reportez vous à la documentation officielle
Qt. Chaque classe possède un en-tête formaté de la manière suivante :
- 12 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Fondements
• Programmation orientée objet en C++ (déclaration d'une classe ou structure, héritage, appel de fonction
membre...) ;
• Différence entre mémoire statique et dynamique (connaître la durée de vie des objets instanciés, et même
mieux : la maîtriser) ;
• Polymorphisme et surcharge d'opérateur ;
• Cast (transformation d'une pointeur sur QObject ou QWidget vers le type réel de l'objet) ;
• Templates (conteneurs de Qt, principalement) ;
• Anglais (pour parcourir la documentation officielle).
De préférence
• Operateurs binaires ~ ! | & (paramétrer certaines fonctionnalités grâce aux drapeaux, même si Qt fournit la
classe QFlags pour simplifier ce traitement) ;
• Itérateurs, en C++ ou en Java (parcours avancé sur des éléments). Qt fournit la méthode foreach, qui évite
l'utilisation des itérateurs, suffisante dans la plupart des cas.
• Avoir un avantage sur les applications concurrentes (en particulier les applications Web) ;
• Diminuer la consommation énergétique (ce qui est particulièrement important si Qt est utilisé sur un
téléphone).
La première étape pour optimiser est de faire tourner l'application dans un profiler. Un profiler fait des statistiques
de l'utilisation du code et permet de trouver les branches et fonctions qui prennent le plus de temps à l'exécution. Il
existe de nombreux profiler pour C++ : Valgrind avec callgrind (Linux), Intel VTune (Linux et Windows), Instruments
(XCode, Mac OS X), Visual Studio Profiler (Windows).
La seconde étape est d'activer les optimisations à la compilation. Ces optimisations sont valables pour Qt comme pour
l'application, il faut donc recompiler les deux et pas seulement l'application. Il faut recompiler en mode release pour
que le code de débogage (QDebug, Q_ASSERT) ne soit pas inclus, ne pas inclure les symboles de débogage (retirer
l'option -g), et activer les optimisations (option -O2). Si le compilateur le permet, l'utilisation de PGO (Profile-Guided
Optimization) permet d'améliorer encore les performances.
Finalement, avec une licence commerciale ou pour un projet open-source, compiler statiquement améliore aussi les
performances.
- 13 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Les objets simples, tel que les chaînes de caractères, conteneurs... peuvent être manipulés comme les types de bases, la
mémoire est nettoyée automatiquement par le destructeur.
QString getSiteName()
{
// pas de problème à l'allouer sur la pile
QString siteName = "Developpez.com";
// pas de problème à l'utiliser comme type de retour
return siteName;
}
- 14 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Ce type d'objet n'utilise en interne qu'un pointeur vers un délégué, ce qui veut dire que ces objets sont extrêmement
rapides à manipuler.
Ce type d'objet est donc très facile à utiliser car on peut l'employer comme s'il s'agissait d'un type de base.
D'autres objets ont besoins d'une gestion de mémoire plus complexe car il faut contrôler précisément leur durée de
vie. Pour ces objets, Qt a introduit le mécanisme de hiérarchie d'objet, qui est disponible pour toutes les sous-classes
de QObject.
Les objets d'une hiérarchie peuvent avoir un objet parent, et des objets enfants (à ne pas confondre avec l'héritage, il
s'agit ici d'encapsulation). Lorsqu'un objet est détruit, tous ses objets enfants sont détruits aussi.
Le parent est précisé dans le constructeur des objets ou grâce à la méthode QObject::setParent().
QString giveString()
{
QObjet parent;
MyObjet *myObjet = new MyObject(&parent);
myObjet->doSomeComputation();
return myObjet->getString();
}
Étonnamment, le code précédent n'a pas de fuite de mémoire. L'objet MyObjet, créé sur le tas, a, comme parent, le
QObject "parent". Lorsque parent arrive à la fin de la fonction giveString(), son destructeur se charge de supprimer
l'objet myObjet.
void showMessage()
{
QDialog dialog;
QVBoxLayout *layout = new QVBoxLayout(&dialog);
QLabel *message = new QLabel("Cliquez sur le bouton");
layout->addWidget(message);
QButton *button = new QButton("Cliquez ici");
layout->addWidget(button);
dialog.exec();
}
- 15 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Quelle magie fait que ce code fonctionne ? Lorsqu'un widget est ajouté au layout, le layout le reparente automatiquement
avec son widget propriétaire (dialog dans ce cas-ci). Finalement, lorsque la fonction se termine, le destructeur de dialog
supprime tous les objets et nettoie la mémoire.
Pour accéder à une instance de cette classe, deux choix sont possible :
Ces deux classes sont des pointeurs intelligents spécialisés dans la manipulation des pointeurs sur QSharedData. Ils
implémentent donc la sémantique des pointeurs avec des accès const (lecture) et non const (écriture). Elles détruiront
le QSharedData une fois son compteur à zéro. Ces pointeurs intelligents possèdent deux fonctions qu'il est utile de
connaître :
- 16 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Cependant, ils fournissent également un outil permettant de gérer automatiquement les fichiers du designer, les fichiers
dans lesquels vous définissez des widgets personnalisés, et même en réalité tout votre projet : qmake. Cet outil permet
de générer un fichier de projet .pro, de générer à partir de ce dernier les règles de compilation de votre projet, et bien
d'autres choses, comme la détection de votre compilateur, du répertoire d'installation de Qt 4...
Un tutoriel a été écrit pour présenter cet outil et décrire son utilisation : Compilation des projets Qt 4.
Pour remédier à ce problème, il est tout à fait possible d'appliquer le moc sur ce fichier. En contre partie, il faut inclure
le fichier généré à la suite de la déclaration de la classe dans le .cpp.
Si vous utilisez qmake, il suffit, juste après la déclaration de la classe, d'inclure un fichier utilisant le nom du fichier
cpp suivi de l'extension .moc. Cette méthode est utilisée dans certains codes de la Q/R pour simplifier la compilation
de l'exemple à un seul fichier.
Comment compiler Qt ?
Auteurs : Thibaut Cuvelier ,
Avant de compiler Qt, vérifiez que des binaires ne sont pas déjà fournis sur Developpez.com.
Tout d'abord, pour une compilation simple, avec toutes les options par défaut, utilisez un de ces jeux de commandes.
Vous devez utiliser, sous Windows, un invite configuré pour votre compilateur (avec les variables %PATH%,
%INCLUDE% et %LIB% configurées), tel que l'Invite de commandes de Visual Studio 2002 / 2003 / 2005 / 2008,
- 17 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
disponible dans le menu Démarrer (sous 2000 / XP : Tous les programmes > Microsoft Visual Studio 2002 / 2003 / 2005 /
2008 > Visual Studio Tools ; sous Vista et Seven : utilisez la barre de recherche).
configure
nmake
configure vous demandera si vous acceptez la licence de Qt : vous devez d'abord la lire (), puis l'accepter (y).
Si vous voulez personnaliser votre compilation (ajouter le support d'autres librairies comme OpenSSL, par exemple),
vous pouvez voir l'ensemble des drapeaux disponibles en utilisant cette commande.
Comment cross-compiler Qt ?
Auteurs : Thibaut Cuvelier ,
Il vous suffit de préciser le drapeau -xplatform lors de la configuration de Qt.
Celui-ci informera le compilateur que les binaires devront être exécutables sur cette plateforme, et que les outils doivent
se lancer sur la plateforme hôte (précisée éventuellement par le drapeau -platform).
Vous pouvez spécifier tous les autres drapeaux dont vous avez besoin.
Pour pouvoir cross-compiler Qt, vous devez disposer d'un cross-compilateur (par exemple,
GCC, ou l'un des cross-compilateurs fournis avec Visual Studio) !
•
Supported Platforms
•
Cross-compilation de Qt4
Pour obtenir un compilateur, regardez l'article sur la cross-compilation avec GCC 4 sous Windows pour Linux
- 18 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
configure -h
Si vous n'êtes pas dans un de ces deux cas, ne compilez pas statiquement votre application.
La LGPL ne change rien au problème : l'utilisateur doit pouvoir remplacer votre version de Qt par celle qu'il désire.
Si vous liez statiquement à Qt, l'utilisateur ne pourra pas remplacer Qt, et vous serez en infraction avec la licence.
Compiler statiquement une application permet de gagner légèrement en performance et de diminuer légèrement la
taille du package à distribuer. Il est rare de compiler statiquement pour GNU/Linux pour des raisons de performance
et de flexibilité.
Pour compiler statiquement, il faut une version de Qt compilée statiquement, il faut recompiler la bibliothèque avec
l'option -static. Ensuite, il faut compiler l'application elle-même statiquement. Si vous utilisez qmake, il suffit d'ajouter
la directive CONFIG += static au fichier de configuration (fichier .pro), de relancer qmake et de recompiler le projet.
Il reste le problème des plug-ins. Qt charge certaines fonctionnalités grâce à un système de plug-ins. Ce chargement
dynamique ne peut évidemment pas fonctionner en version statique. Pour utiliser un plug-in, il faut modifier
l'application pour le charger explicitement à la compilation. Ceci est fait à l'aide de la macro Q_IMPORT_PLUGIN().
#include <QApplication>
#include <QtPlugin>
Q_IMPORT_PLUGIN(qtaccessiblewidgets)
Q_IMPORT_PLUGIN(qjpeg)
Q_IMPORT_PLUGIN(qgif)
Le plug-in qtaccessiblewidgets permet d'utiliser les outils d'accessibilité avec l'application, il est recommandé de
toujours inclure ce plug-in.
• Indiquer au compilateur où rechercher les fichiers d'en-tête relatifs à la bibliothèque pour avoir accès aux
fonctions qu'elle propose ;
• Indiquer au compilateur de lier la bilbiothèque à l'exécutable du projet.
- 19 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
La manière classique est d'ajouter l'option de compilation suivante à l'appel de votre compilateur :
-I/chemin/des/en-têtes/de/la/bilbiothèque
Si vous utilisez un IDE, fouillez dans les propriétés de votre projet afin de lui indiquer où rechercher les fichiers d'en-
tête de votre bibliothèque.
INCLUDEPATH += /chemin/des/en-têtes/de/la/bilbiothèque
Vous pouvez dès à présent inclure dans votre code source des fichiers provenant du répertoire spécifié.
Pour lier une librairie à l'exécutable d'un projet Qt, il est nécessaire de modifier le fichier de projet afin que le Makefile
généré par qmake tienne compte de cette bibliothèque.
La manière classique de linker (lier) une bibliothèque à un projet C/C++ est d'ajouter les options de compilation
suivantes lors de l'exécution du linker (ld, sous les systèmes GNU/Linux) :
-lmaLibrairie
-L/chemin/de/la/lib
LIBS += -lmaLibrairie
LIBS += -L/chemin/de/la/lib
Sous Windows, le caractère \ utilisé comme séparateur dans les chemins doit être échappé (par
exemple, C:\MonDossier devient c:\\MonDossier). De plus, l'espace dans un nom de dossier
peut entraîner des erreurs, indiquez-le dans ce cas entre guillemets (par exemple, C:\\Mon
Dossier devient "c:\\Mon Dossier").
Une fois le fichier de projet modifié, exécutez qmake pour mettre à jour les Makefile, puis make (ou nmake sous Visual
Studio) pour recompiler votre projet.
- 20 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Général
• Support OpenSSL : OpenSSL (v0.9.8) ;
• Support DBus : DBus ;
• Support Direct3D (déprécié dès Qt 4.5) : DirectX SDK (v9) ;
• Support OpenGL : inclus dans l'OS ;
• Support OpenVG : inclus dans le SDK de la plateforme ou ShivaVG.
Back-ends Phonon
• Back-end DirectX : DirectX SDK (v9) ;
• Back-end VLC : libvlc ;
• Back-end MPlayer : MPlayer ;
Les librairies nécessaires sont en général installées en même temps que le SGBD.
Actuellement, voici l'ensemble des compilateurs supportés pour la version 4.5.3 de Qt, dans leur notation canonique :
- 21 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Pour compiler les sources Qt avec les plateformes supportées, il est nécessaire que le compilateur soit installé sur votre
machine, que les variables permettant de le connaître soient définies dans l'instance de votre shell (invite de commande
sous Windows) et que vous ajoutiez l'argument -platform lors de l'appel à configure (configuration de la compilation),
suivi du compilateur sous la forme canonique (par exemple, $>configure -platform win32-msvc2008).
- 22 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
La documentation regorge d'informations permettant de trouver ce nom. Par exemple, pour Mac, on y trouve
Q_WS_MAC et pour Windows, on y trouve Q_WS_WIN.
Mais comment exploiter ces résultats ? Eh bien, une condition de ce type fera parfaitement l'affaire !
#if defined(Q_WS_WIN)
// ...
#endif
Dans ce code, on dit : "Si Q_WS_WIN est défini, ..." ou tout simplement : "Si on tourne sous Windows actuellement, ...".
Voici un exemple vous permettant de récupérer l'OS utilisé et de l'indiquer à l'utilisateur dans une boîte de dialogue.
#include <QApplication>
#include <QtGui>
#include "main.moc"
- 23 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Généralités techniques > Les différents systèmes supportés > Windows
Comment déployer une application Qt sous Windows ?
Auteurs : François Jaffré ,
Si vous avez créé votre application à l'aide de Visual Studio et, par conséquent, utilisé le compilateur C++ de Microsoft,
il faut procéder de la manière suivante :
• Intaller le runtime VC, correspondant à la version de Visual Studio que vous utilisez, sur la machine cible ;
• Mettre dans le répertoire de votre exécutable les DLL de Qt, QtCore4.dll et QtGui4.dll ;
• Ajouter dans ce même répertoire les DLL correspondant aux autres modules de Qt (QtXml4.dll,
QtWebKit4.dll, QtSvg4.dll...), si votre exécutable les utilise ;
• Ajouter dans ce même répertoire les DLL correspondant aux librairies tierces, compléments de Qt (pour Qwt :
qwt5.dll ; pour QCA : qca2.dll...), si votre exécutable les utilise ;
• Ajouter le répertoire correspondant aux plug-ins que vous utilisez.
Si vous avez compilé votre application avec MinGW/GCC, procédez de la manière suivante :
Au final, le répertoire d'une application Qt, utilisant, par exemple, les plug-ins MySQL, MNG, SVG et TIFF, ressemble
à ceci :
|App
\
-app.exe
-QtGui4.dll
-QtCore4.dll
-QtSql4.dll (module SQL)
-mingwm10.dll (si vous avez compilé avec MinGW)
-libmysql.dll (DLL nécessaire au plug-in du driver MySQL)
\sqldrivers (répertoire des drivers pour QtSQL)
-qmysql.dll (driver MySQL)
\imageformats (répertoire des plug-ins de traitement des formats d'image)
-qmng4.dll (MNG)
-qsvg4.dll (SVG)
-qtiff4.dll (TIFF)
Votre exécutable doit, dans tous les cas, être compilé en mode release.
Les DLL de Qt se trouvent le plus souvent sous Windows dans C:\Qt\4.x.x\bin. Prenez bien
les DLL correspondant à la version release de Qt, celles qui n'ont pas de d dans leur nom.
Par exemple, QtCore4.dll, la version release, et QtCored4.dll, la version debug.
- 24 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Généralités techniques > Les différents systèmes supportés > Linux
- 25 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Généralités techniques > Les différents systèmes supportés > OSX
- 26 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Généralités techniques > Les différents systèmes supportés > Symbian
- 27 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Généralités techniques > Les différents systèmes supportés > Meego
- 28 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 29 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
En fait, si une nouvelle instance de QObject est créée et qu'on lui spécifie un parent - le premier argument du
constructeur -, c'est ce parent qui sera chargé de la destruction du fils.
La majorité des classes de Qt4 hérite plus ou moins directement de QObject, mais attention, ce n'est pas le cas de toutes.
L'indicateur est la possibilité de passer un objet parent au constructeur.
Lors de l'utilisation de la macro Q_OBJECT, on définit un certain nombre de méthodes et de variables statiques. Ces
méthodes et ces variables sont implémentées dans un fichier généré automatiquement par qmake à l'aide de l'outil moc.
Vous pouvez naturellement créer ce fichier manuellement et l'ajouter pour compilation et édition des liens.
Cette liste implique que les objets fils héritant de QObject devraient être alloués sur le tas et non la pile. A priori,
le code d'effacement est fait de telle sorte qu'il ne devrait pas y avoir de problème en allouant un objet sur la pile
car la destruction d'un objet entraîne sa suppression dans la liste des parents. En revanche, effacer manuellement ou
automatiquement par destruction dans la pile les objets fils peut entraîner un surcoût. Enfin, étant utilisé avec une
sémantique de pointeurs, il vaut mieux utiliser les pointeurs.
{ QObject parent;
QObject *enfant = new QObject(&parent);
}
// enfant est correctement supprimé de la mémoire par parent
QObject autreParent;
enfant->setParent(&autreParent); // change le parent de enfant
- 30 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
delete parent;
// enfant n'est pas supprimé car parent ne "possède" plus enfant
La relation parent-enfant peut poser problème lorsque les QObject sont alloués sur la pile. Lorsqu'un objet est alloué
sur la pile, et a un parent, le parent pourrait appeler delete sur l'objet qui est sur la pile.
{
// !!! exemple de ce qu'il NE faut PAS faire, ne pas recopier !
QPushButton button("button");
QWidget widget;
button.setParent(&widget);
} // crash ici
// lorsque widget est détruit à la fin du scope, il supprime button à l'aide de delete.
// button avait été aloué sur la pile
lien : QObject
lien : Le modèle QObject
Lorsque vous faites un héritage multiple, mettez en premier la classe héritant de QObject.
Peut-on utiliser des pointeurs intelligents sans danger avec des QObject ?
Auteurs : Aurélien Régat-Barrel ,
QObject (et toutes les classes qui en dérivent) ne se marrient pas très bien avec les pointeurs intelligents classiques du C
++, tels que auto_ptr ou shared_ptr. Comme expliqué dans la question Un new sans delete ?, Qt implémente via QObject
un mécanisme de gestion de la mémoire dont le principe est qu'un QObject parent détruise automatiquement tous ses
objets QObject enfants.
Ce mécanisme est fort pratique et permet de grandement simplifier la gestion de la mémoire. Cependant, il entre
en conflit avec tout autre mécanisme de libération de la mémoire tel que ceux implémentés au moyen de pointeurs
intelligents.
En effet, si vous déclarez un pointeur intelligent sur une instance de QObject, ce dernier aura en charge la destruction
de cette instance. Si par malheur votre QObject se trouve être l'enfant d'un autre QObject, et que ce parent vient à
être détruit, votre instance sera elle aussi automatiquement détruite, alors que votre pointeur intelligent continuera de
pointer vers elle ! Et quand votre pointeur intelligent estimera qu'il est temps de la détruire, il effectuera un appel à
delete sur un objet déjà détruit (double utilisation de delete) avec toutes les conséquences fâcheuses que l'on connaît.
À noter que spécifier un parent nul au moment de la construction de votre QObject ne vous garantit pas pour autant
que ce dernier ne sera pas par la suite reparenté via la fonction setParent(), chose qui se produit assez régulièrement
entre objets graphiques (QWidget).
En conséquence, il est déconseillé d'utiliser des pointeurs intelligents sur des objets de type QObject. Si jamais vous
devez néanmoins y avoir recours, vous devez protéger votre instance d'une double deletion au moyen d'un guarded
pointer (QPointer en Qt 4, ou QGuardedPtr en Qt 3), comme dans l'exemple suivant.
- 31 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
La particularité d'un guarded pointer est qu'il est automatiquement mis à zéro si l'instance associée est détruite. Ainsi,
dans cet exemple, quand shared_ptr effectuera un appel à delete sur une instance déjà détruite, cela reviendra à effectuer
un delete sur un pointeur nul, c'est-à-dire à ne rien faire du tout.
Ayez aussi à l'esprit que shared_ptr perd son sens originel et se comporte davantage comme un weak_ptr, c'est-à-dire
que vous devez systématiquement vous assurer qu'il ne soit pas nul avant de l'utiliser.
Vu la lourdeur de cette écriture et le changement de sémantique introduit, on comprend mieux pourquoi il est déconseillé
d'employer des pointeurs intelligents sur des objets dérivant de QObjet.
Lorsque l'on appuie sur le bouton, le signal clicked est émis. Ce qui va appeler directement le slot butClicked(). À ce
niveau, la pile d'appel correspond à :
Ainsi, le bouton sur lequel on veut faire un delete est utilisé par la pile d'appel. Le delete va produire une erreur mémoire
et votre application se retrouve en état indéterminé.
Pour cela, QObject fournit la fonction deleteLater, qui va poster un évènement et le QObject sera détruit par l'eventloop
dès que tous danger est écarté.
- 32 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
void butClicked()
{
m_but->deleteLater();
}
Il est intéressant de constater que cette fonction est un slot et peut donc être connecté à un
signal.
Il est aussi possible d'appeler plusieurs fois cette fonction sans aucun danger.
• Objet optionnel : Si l'objet est optionnel, il est fortement conseillé d'utiliser le pointeur intelligent
QWeakPointer (ou QPointer pour Qt avant 4.6) qui va permettre de savoir si le QObject pointé existe.
• Les objets partagé entre classes : Les QObject ne sont pas prévue pour être utilisée par plusieurs classes en
même temps. Donc cela ne devrait pas se poser.
• Les QWidget : Comme ils peuvent être reparentés (par les layouts par exemple), il est fortement conseillé
d'utiliser des pointeurs pour garantir leur destruction de manière correcte.
• Les autres : Au choix. Il peut être intéressant de ne pas utiliser de pointeur pour éviter de faire les allocation à
la main. Ceci ne pose aucun problème avec le système de destruction parent/enfant, car ils seront détruit avant
la classe. Toute fois il ne faut pas oublier de mettre this en parent.
Il est très important que tous les QObject en membre d'une classe aient pour parent this. QWidget est un cas particulier
où le parent dépend de son niveau dans l'arbre parent/enfants des widgets et où le parent est forcément un QWidget.
- 33 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
De nombreuses méthodes nécessitent la présence de la macro Q_OBJECT pour fonctionner correctement, et c'est pour
cela qu'il est recommandé à plusieurs reprises par la documentation de l'utiliser « dans toutes les sous-classes de QObject
sans prêter attention au fait qu'elles utilisent actuellement ou non les signaux, les slots et les propriétés ».
Le fonctionnement du moc est simple : il lit les fichiers sources et retrouve les déclarations de classe où la macro
Q_OBJECT est utilisée. Une fois cela terminé, il génère des fichiers, reconnaissables par leur nom sous la forme de
moc_[Nom du fichier d'en-tête].cpp (dans le cas d'une utilisation de Q_OBJECT dans un fichier d'en-tête) ou bien sous
la forme de [Nom du fichier].moc (dans le cas d'une utilisation de la macro sans fichier d'en-tête), qui contiendront le
code de méta-objet par exemple nécessaire à l'utilisation des signaux et des slots.
Ce système possède tout de même des points faibles. Par exemple, il ne gère pas correctement les classes templates qui
se voient donc être privées des signaux et des slots. La documentation détaille les limitations que cause le moc.
• le système de signaux et de slots, qui permet la communication entre des objets sans rapport particulier ;
• l'introspection, soit la capacité d'un programme à analyser son état lors de l'exécution ;
- 34 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• le système de propriétés, un dispositif multiplateforme de gestion de valeurs avec au minimum une fonction de
lecture.
lien : Pourquoi Qt n'utilise pas les templates pour les signaux et les slots ?
Voici les principales instructions utilisables pour signaler au moc que le recensement doit être effectué, ainsi que leur
effet :
Par exemple :
public:
Q_INVOKABLE MyWidget(QObject *parent = 0); // Constructeur recensé
void myFunction(); // Méthode non recensée
Q_INVOKABLE void myOtherFunction(); // Méthode recensée
Q_SLOT void mySlot(); // Slot recensé
public slots:
void myOtherSlot(); // Slot recensé
};
- 35 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 36 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 37 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Pour utiliser ce système, il faut hériter de QObject, soit directement, soit à l'aide d'un des objets dérivés de QObject.
Ensuite, il faut définir la macro Q_OBJECT qui servira à qmake puis à moc pour générer le code nécessaire à
l'utilisation de ces fonctions.
signal:
void monSignal();
Pour que moc génère le code qui va bien et pour que le signal puisse être utilisé. On appellera un signal par :
emit monSignal();
Ces signaux peuvent être connectés à d'autres signaux ou à des slots. Ces slots sont des fonctions du développeur qui
seront appelées dès que possible.
public slots:
void monSlot();
Une fois les slots définis, il suffit de connecter les signaux et les slots entre eux. Comme il s'agit de connexion directe, il
n'est pas possible de connecter un signal sans paramètre à un slot avec un paramètre. Pour cela, il faut utiliser entre-
temps QSignalMapper.
On constatera aussi que signaux et slots ne peuvent pas retourner de valeur, pour l'instant.
- 38 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Son signal textChanged( const QString& ) permet de récupérer le texte présent dans le QLineEdit au moment de
l'émission du signal. De même, son slot setText(const QString& ) permet de redéfinir le texte contenu dans le QLineEdit
à l'aide d'un objet QString.
Rappel : Il est possible de connecter un signal avec un slot, mais on peut également connecter un signal à un autre
signal. Pour créer une connexion signal/slot (ou signal/signal) qui permette la transmission de valeurs, il suffit d'écrire
la signature complète de chaque signal/slot dans la fonction connect().
Autrement dit, il faut indiquer le nom des signaux/slots en question, ainsi que les types des arguments qu'ils prennent
en paramètre.
Attention, car il faut prendre certaines précautions. Dans une fonction connect(), les types des arguments des deux
fonctions doivent être compatibles et placés dans le même ordre. Des arguments sont compatibles si le même objet est
en jeux. Par exemple, const QString & est compatible avec QString. Par contre, QString* et QString& ne le sont pas.
Voici un exemple de connexion avec 2 types compatibles.
connect(this,SIGNAL(monSignal(QString,int)),somethingElse,SLOT(monSlot(const QString&,int)));
Cependant, le signal ou le slot qui est situé dans la partie droite de la fonction connect() peut avoir un nombre
d'arguments inférieur ou égal à celui du signal situé à gauche. Par exemple la connexion suivante est valide. L'argument
int sera simplement ignoré.
connect(this,SIGNAL(monSignal(QString,int)),somethingElse,SLOT(monSlot(QString)))
Pour créer un signal ou un slot avec des arguments il suffit d'ajouter les noms des types dans le prototype.
Ainsi, pour émettre son signal il suffit d'utiliser le mot clef emit.
- 39 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
La connexion se fera avec un signal ou un slot qui prend un argument de type nom_type.
Cette partie ne concerne pas les Les signaux et autres slots ? : elle traite de la méthode automatique.
Bien qu'il soit plutôt aisé d'implémenter un slot et de le connecter dans le constructeur, nous pouvons tout aussi bien
utiliser l'outil d'auto-connexion de QMetaObject pour connecter le signal clicked() de myButton à un slot dans notre
classe, ou pour connecter les signaux et les slots clicked() :
QMetaObject::connectSlotsByName(QObject *object);
Cette fonction du QMetaObject de Qt connecte automatiquement tous slots qui respectent la convention
on_Nomobjet_Nomsignal() au signal Nomsignal() correspondant de l'object Nomobjet. Deux conditions sont à remplir.
• L'objet NomObjet doit être un enfant de l'objet passé en paramètre à la méthode connectSlotByName().
• Les objets (parents et enfants) doivent être nommés avec la fonction setObjectName(const QString& name).
Exemple
class MainWindows : public QWidget
{
Q_OBJECT
public :
MainWindows(QWidget * parent = 0);
public slots :
// slot qui sera connecté au signal clicked() de l'objet myButton
// par l'autoconnect
void on_myButton_clicked();
};
MainWindows::MainWindows(QWidget * parent):QWidget(parent)
{
...
QPushButton * pButton = new QPushButton("essai auto connect");
// nom du bouton pour être retrouvé par l'autoconnect
pButton->setObjectName("myButton");
...
// auto connection des signaux/slots
QMetaObject::connectSlotsByName(this);
}
- 40 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Qupposons, cette fois-ci, que nous créons notre fenêtre via le Qt Designer et non plus en ligne de code. Nous possédons
alors un fichier supplémentaire, à savoir : mainwindows.ui. Lors de la compilation, l'outil uic de Qt, se charge de générer
le code de la fonction setupUi() de notre fenêtre mainwindows.ui. Le code généré utilise alors de la même façon :
• setObjectName(const QString & name) : pour nommer les objets définis dans mainwindows.ui ;
• QMetaObject::connectSlotsByName : pour autoconnecter les objets définis dans mainwindows.ui pendant
l'appel à setupUi().
Il est donc possible d'utiliser, de la même façon, les auto-connexions sur une GUI codée à la main que sur une GUI
créée à l'aide de Qt Designer.
Si deux enfants ont le même nom, l'auto-connect ne se fera que sur le premier enfant trouvé.
Comment paramétrer un slot selon les objets qui lui sont connectés ?
Auteurs : Kinj1 ,
Qt propose de nombreuses classes avec de nombreux signaux déjà définis. Cependant, il peut parfois être intéressant
d'ajouter de l'information à ces signaux afin de les paramétrer selon l'objet émetteur. On pourrait ainsi vouloir que
différents boutons réalisant une action commune, par exemple ouvrir une page Web lorsque l'on clique dessus, soient
connectés à un même slot auquel on précise l'URL à utiliser. Seulement, le signal clicked() de la classe QPushButton ne
transmet aucun paramètre, ce qui ne permet pas de spécifier l'URL.
Une première solution consiste alors à connecter le signal clicked() de chaque bouton à un slot différent qui se contentera
d'appeler la fonction d'ouverture de la page Web avec l'url correspondante. Cependant, comme il est nécessaire de créer
un slot différent par bouton, cela rallonge inutilement la taille du code, surtout lorsqu'il y a un grand nombre de boutons.
Une autre solution est d'utiliser la classe QSignalMapper. Dans notre exemple, celle-ci va s'occuper d'appeler le slot
ouvrant la page Web avec un paramètre configuré pour chacun des boutons (l'URL de la page). Nous avons donc
d'un côté les signaux clicked() des différents QPushButton, et de l'autre un slot openUrl(const QString& url) et le
QSignalMapper au milieu pour faire les correspondances.
Tout d'abord il faut créer un objet QSignalMapper, puis connecter les signaux des boutons à son slot map(). On définit
alors, pour chacun des boutons, le paramètre à utiliser pour l'appel à openUrl() via setMapping().
// Bouton 1
connect(bouton1, SIGNAL(clicked()), mapper, SLOT(map()));
mapper->setMapping(bouton1, "http://url1");
// Bouton 2
connect(bouton2, SIGNAL(clicked()), mapper, SLOT(map()));
mapper->setMapping(bouton2, "http://url2");
// Autres boutons ?
- 41 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Enfin, il suffit de connecter le signal mapped() de QSignalMapper à notre slot final. Ainsi quand un bouton émettra son
signal, le slot openUrl() sera utilisé avec le paramètre correspondant au bouton.
Note : QSignalMapper ne se limite pas à des paramètres de type QString. Il est également possible d'utiliser des entiers
ou encore des QWidget* et des QObject*. Il faut dans ce cas utiliser le signal mapped() correspondant au type que l'on
veut transmettre.
Cette dernière catégorie peut être elle-même divisée en deux autres catégories.
• Appel direct ;
• Appel placé en queue de la boucle d'événement du thread récepteur.
Dans le premier cas, le slot est exécuté dans le contexte du thread appelant.
Dans le second cas, le contexte d'exécution du thread dépend du mode de connexion fourni à QObject::connect.
• Directe (Qt::DirectConnection) : le slot est appelé immédiatement après l'émission du signal, et il est exécuté
dans le thread contenant l'émission du signal ;
• Placé en queue (Qt::QueuedConnection) : le signal est traité comme un événement et le slot concerné est donc
appelé lors du prochain passage dans la boucle d'événement du thread dans lequel le destinataire vit (c'est-
à-dire le thread dans lequel il a été créé ou si QObject::moveToThread() a été utilisé, dans le thread qui a été
donné à cette fonction) ;
• Automatique (Qt::AutoConnection, paramètre par défaut): si le destinataire du signal vit dans le même thread,
la connexion correspond à une connexion directe ; dans le cas contraire le comportement est celui d'une
connexion en queue.
#include <QtDebug>
public slots:
void mySlot(int n)
{
- 42 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
public slots:
void threadSlot(int n)
{
qDebug() << "MyThread::threadSlot(int) appel depuis le thread #" <<
QThread::currentThreadId() << ": n=" << n << "\n";
}
protected:
virtual void run()
{
threadSlot(4);
exec();
}
};
public:
Window()
{
QPushButton *threadSlotCall = new QPushButton("Appel de MyThread::threadSlot() tel une
fonction");
QPushButton *threadSlotCallSig = new QPushButton("Appel de MyThread::threadSlot() par un
signal");
QPushButton *queudSlotCallSig = new QPushButton("Appel de RandomObject::mySlot() par un
signal en queue");
moveRandomObjToThread = new QPushButton("Déplacer RandomObject vers le thread");
QPushButton *quitBtn = new QPushButton("Quitter");
setLayout(layout);
/* Le mode de connexion n'étant pas spécifié, la connexion est choisie de façon automatique.
* Puisque l'objet 'thread' vit dans le même thread que notre instance de Window, la
connexion
- 43 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
thread.start();
}
signals:
void mySignal(int n);
void mySignalForQueued(int n);
private slots:
void onCallThreadSlotSig()
{
thread.threadSlot(42);
}
void onCallThreadSlot()
{
emit mySignal(1764);
}
void onCallThreadQueuedSlotSig()
{
emit mySignalForQueued(123);
}
void moveRandomObjectToThread()
{
moveRandomObjToThread->setEnabled(false);
obj.moveToThread(&thread);
}
void onQuit()
{
thread.quit();
bool cleanFinish = thread.wait(2000);
if (!cleanFinish)
{
qDebug() << "Impossible d'arrêter le thread, terminaison forcée.\n";
thread.terminate();
}
qApp->quit();
}
private:
MyThread thread;
RandomObject obj;
QPushButton * moveRandomObjToThread;
};
return app.exec();
}
- 44 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
#include "main.moc"
Le slot qui nous intéresse est ici MyThread::threadSlot(int). Il est appelé 3 fois dans ce programme.
• Dans void MyThread::run(), threadSlot() est exécuté dans le contexte du thread exécutant run(), car appelé
directement ;
• Dans void Window::onCallThreadSlot(), threadSlot() est exécuté dans le contexte du thread principal, car
appelé directement depuis celui-ci ;
• Dans void Window::onCallThreadSlotSig(), threadSlot() est exécuté dans le contexte du thread principal, car
appelé indirectement par l'émission d'un signal à partir de ce thread.
Prenons un exemple.
MaClasse::MaClasse()
{
QPushButton * btn = new QPushButton("bouton");
QObject::connect(btn, SIGNAL(clicked()), this, SLOT(monSlot()));
}
MaClasse::monSlot()
{
QObject * emetteur = sender();
// emetteur contient le QPushButton btn si on clique sur ce bouton
}
Entendu, mais que faire de ce QObject ? C'est le QPushButton que l'on voulait !
Pas de panique ! Pour accéder pleinement à l'émetteur, la prochaine étape est de le caster. Voyons comment faire ça
proprement avec qobject_cast.
MaClasse::monSlot()
{
QObject * emetteur = sender();
- 45 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Cette méthode ne fonctionne pas en multithread ! Si l'émetteur et le récepteur ne sont pas dans
le même thread, sender() ne renvoie rien (0). Dans ce cas, vous devez utiliser QSignalMapper
lien : Comment récupérer et utiliser l'objet déclencheur d'un slot avec QSignalMapper ?
Dans le cas présent, on a une liste de boutons, contenant du texte, créée à partir d'une liste de QString. On souhaite lier
l'action de presser un bouton (signal clicked()) à un signal qui contient le texte de ce bouton (signal clicked(QString)).
public:
ButtonWidget(QStringList texts, QWidget *parent = 0);
signals:
void clicked(const QString &text);
private:
QSignalMapper *signalMapper;
};
setLayout(gridLayout);
}
- 46 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
On connecte le signal déclencheur souhaité de chaque objet avec le slot map() du QSignalMapper.
On indique au QSignalMapper des liens entre des objets et des paramètres via la méthode setMapping() (ici de type
QString, mais on peut aussi le faire avec des int, QObject* ou QWidget*).
A chaque appel au slot map(), le QSignalMapper identifie l'entité qui déclenche le slot map() (sender()), cherche si cette
entité est liée à un paramètre, et émet le signal mapped() avec le paramètre trouvé.
- 47 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
1 - La surcharge de fonction
Lors qu'un QObject reçoit un événement, celui-ci passe par la fonction bool QObject::event(QEvent *). C'est le point
d'entrée lorsque un évènement arrive sur un QObject. Cette fonction va ensuite vérifier le type de l'évènement et
appeler une sous-fonction liée à ce type. Toutes ces fonctions ont pour signature void XXXEvent(QXXXEvent *) et
sont principalement définies dans QObject et QWidget. Par exemple, si l'évènement est un QPaintEvent, la fonction
paintEvent() sera appelée. Il suffit donc de choisir la méthode à surcharger suivant l'événement avec lequel on veut
interagir.
Par exemple, comment tracer une courbe en fonction des clics de souris ?
#include <QtGui>
2 - Event filter
Cette méthode consiste à installer un filtre d'évènements sur un QObject. Ce filtre d'évènements est en réalité un
QObject. Cette méthode a l'avantage d'éviter des héritages inutiles et de pouvoir manipuler les évènements d'un ou
plusieurs autres QObject.
Pour qu'un QObject puisse être utilisé comme filtre, il doit surcharger la méthode bool QObject::eventFilter(QObject
*obj, QEvent *event). Cette méthode prend en paramètre un QObject correspondant au QObject à filtrer et un QEvent,
son événement. Si la fonction retourne vrai, l'évènement s'arrête et le QObject ne traitera pas son événement. Si la
fonction retourne faux, l'événement sera traité par le QObject.
- 48 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Ensuite, il suffit d'appeler la méthode installEventFilter(QObject *) du QObject à filtrer avec pour paramètre le
QObject servant de filtre.
#include <QtGui>
- 49 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
la méthode par la surcharge de fonctions est utiliséé pour manipuler les évènements du
QObject par lui même. Tandis que la méthode avec les filtres d'événements est surtout utilisée
pour filtrer et interagir avec les événements d'un autre QObject.
Mais il existe une alternative intéressante lorsque ce traitement n'a vraiment aucun intérêt à être mis dans un thread :
QCoreApplication (et donc QApplication ) possède la méthode statique processevents() permettant l'exécution d'une
partie ou de tous les événements de la boucles d'événements.
- 50 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
vl->addWidget(bouton1);
vl->addWidget(bouton2);
}
w.setLayout(vl);
w.show();
return app.exec();
}
- 51 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Quel rapport avec Qt ? Eh bien, la bibliothèque permet de récupérer les arguments à l'aide de la fonction
QCoreApplication::arguments. La récupération sert, par exemple, à récupérer le chemin d'un éventuel fichier ouvert
par clic sur l'icône de celui-ci.
Note : Lors de la déclaration de la fonction main(), il faut mettre les arguments pour que ce qui est donné marche, c'est
à dire utiliser un début de code comme celui-ci pour la fonction main :
Remarque : En règle générale, le premier élément correspond au nom de l'exécutable. Suivant la plateforme et le mode
d'exécution, cet élément peut aussi contenir le chemin relatif ou le chemin absolu de l'exécutable concaténé avec son nom.
Attention : Sous Mac OS X, le double-clic sur un fichier ne sera pas renseigné dans les arguments, contrairement à
Windows et Linux. Pour cela il faut utiliser QFileOpenEvent.
- 52 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
#include <QSharedMemory>
#include <QPushButton>
#include <QMessageBox>
Il existe également les classes QtSingleApplication et QtSingleCoreApplication qui s'occupent de cela. Elles sont
présentes dans les Qt Solutions sous licence LGPL.
- 53 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Pour l'opération inverse, transformer un QString en std::string, utilisez la fonction membre toStdString().
QString adresseIp("127.0.0.1");
QByteArray adresseIpEncodee = adresseIp.toUtf8();
printf(adresseIpEncodee.constData());
Avec des chaînes de type C, il faut être attentif à la mémoire. Par exemple, le code suivant provoquera des problèmes
de mémoire.
QStringList list;
list << "C" << "C++" << "Qt";
QList<const char*> ipListEnChar;
foreach(const QString & ip, list)
{
QByteArray adresseIpEncodee = ip.toUtf8();
ipListEnChar << adresseIpEncodee.constData(); // le pointeur sera invalide
}
foreach(const char *str, ipListEnChar)
{
printf(str); // le résultat est imprévisible
- 54 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Il faut revenir aux vielles habitudes de C et gérer les allocations à la main. Il suffit dans l'exemple de s'assurer que les
objets QByteArray ne soient pas détruits.
QStringList list;
list << "C" << "C++" << "Qt";
QList<QByteArray> ipListEnCharData;
QList<const char*> ipListEnChar;
foreach(const QString & ip, list)
{
QByteArray adresseIpEncodee = ip.toUtf8();
ipListEnChar << adresseIpEncodee.constData();
ipListEnCharData << adresseIpEncodee;
}
foreach(const char *str, ipListEnChar)
{
printf(str);
}
Dans un problème réel, le tableau de char * serait caché dans les fonctions C utilisées, et il faut être rester attentif à
la gestion de la mémoire.
Remarque : QString permet aussi une conversion vers les formats std::string et std::wstring fournis par la STL.
Chaque fonction arg retourne une nouvelle chaîne où les %n sont placés par ordre croissant. La fonction arg possède
énormément de versions différentes qui vont permettre de remplacer un formateur par un nombre ou une chaîne. De
plus, si plusieurs formateurs ont le même nombre, ils seront remplacés par la même valeur.
Cet outil est d'autant plus puissant que l'on peut faire du formatage récursif : l'on peut ajouter des formateurs lors
du remplacement d'un formateur.
QString s = "%1";
//%1 est remplacé par "formatage récursif : %1 %2"
- 55 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Avec QString::number(), il est aussi possible de spécifier la base pour les entiers, et le format et la précision pour les
réels. La méthode statique QString::number() possède un équivalent pour convertir un nombre dans un objet existant :
QString::setNum().
Pour insérer un nombre dans une chaîne de caractères, il est plus simple d'utiliser les fonctionnalités de formatage de
QString.
Avec sprintf()
QString str;
int val=32;
str = str.sprintf("Image_%05d" , val ); // str == "Image_00032"
Avec arg()
QString str = "Image_%1";
int val=32;
str = str.arg(val, 5 , 10 , QChar('0') ); // str == "Image_00032"
- 56 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• Comme la conversion peut être impossible, un pointeur vers un booléen permet de récupérer le résultat de la
conversion ;
• Pour la conversion vers un des types entiers, il est possible de spécifier la base (2 à 36).
Remarque : Le même principe de conversion existe pour les autres types de variables numériques.
• toLong()
• toShort()
• toUInt()
• toUShort()
• toULongLong()
Le premier argument est un caractère qui précise le format, les formats possibles sont :
- 57 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
// vaut "2.997925e+08"
QString::number(299792458.0, 'e');
// vaut "299792458.000000", voir plus loin pour comprendre pourquoi
QString::number(299792458.0, 'f');
Le second argument permet de spécifier la précision utilisée. Par défaut, Qt utilise une précision de 6, ce qui explique
le résultat de l'exemple précédent.
// vaut "299792458.0"
QString::number(299792458.0, 'f', 1);
Il est suggéré de toujours préciser le format lorsque l'on veut convertir des réels (que ce soit avec Qt ou autre). Dans le
cas contraire, un affichage inattendu peut apparaître lorsque les nombres deviennent très petits ou très grand, ce qui
n'apparaît généralement pas dans les tests lors du développement.
Pour insérer un réel dans une chaîne de caractère, il est plus simple d'utiliser la fonctionnalité de formatage de QString
if(texte.isEmpty()){
...
}
Il est possible de comparer QString avec un tableau de char, ce qui permet aussi de tester si une chaîne est vide.
// mauvaise idée
if(texte == ""){
...
}
Cela fonctionne, mais il y a une conversion implicite de "" en QLatin1String, ce qui est inutile pour une chaîne vide et
est légèrement moins performant que l'exemple précédent.
Pour convertir un chaînes sur 8 bits en QString, il est possible de l'encoder grâce aux méthodes statiques fromAscii(),
fromLatin1(), fromUtf8(), et fromLocal8Bit().
- 58 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Par défaut, QString interprète une chaîne C avec l'encodage Latin 1 (ISO 8859-1). Il est possible de changer ce
comportement de façon globale grâce à la méthode statique QTextCodec::setCodecForCStrings().
Pour convertir un objet QString en tableau de char, il faut utiliser une des méthodes toAscii(), toLatin1(), toUtf8() ou
toLocal8Bit(). Si d'autres encodages sont nécessaires, il suffit d'utiliser QTextCodec, qui permet d'encoder à peu prêt
n'importe quoi.
Exemple :
- 59 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 60 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 61 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Modules > QtCore > Fichiers et répertoires > Opérations de base
Comment effacer un fichier ?
Auteurs : François Jaffré ,
Pour cela il faut utiliser les méthodes suivantes de QFile :
- 62 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Première methode
// On référence l'objet file au fichier
QFile file("C:/existe.txt");
// Efface le fichier "existe.txt" et renvoie true ou false si l'operation bien réussi
bool valid = file.remove();
Deuxième méthode
// Efface le fichier "existe.txt" et renvoie true ou false si l'opération a bien réussi
bool valid = QFile::remove("C:/existe.txt");
- 63 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• bool QFile::exists() const : permet de verifier si le fichier pointé par l'objet QFile existe.
• static bool QFile::exists (const QString & fileName) : permet de vérifier si le fichier "fileName" existe.
Première méthode
// On réference l'objet file au fichier
QFile file("C:/existe.txt");
// Si valid == true, le fichier existe
bool valid = file.exists();
Deuxième méthode
//Si valid == true, le fichier existe
bool valid = QFile::exists("C:/existe.txt");
- 64 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• bool QFile::copy (const QString & newName) : permet la copie du fichier contenu dans l'objet QFile.
• static bool QFile::copy (const QString & fileName, const QString & newName) : permet la copie du fichier
"fileName" en "newName".
Remarque : Ces deux méthodes renvoient true si la copie s'est bien passée et renvoie false dans le cas contraire. Si le
fichier spécifié "newName" existe déjà, la copie sera annulée et la méthode renverra false.
La liste de tous les répertoires pouvant être récupérés correspond à l'énumération StandardLocation.
Remarque : si vous utilisez l'option QDesktopServices:: DataLocation, il est impératif que vous ayez défini
préalablement le nom de l'application et le nom de l'organisation à l'aide des méthodes setApplicationName() et
setOrganizationDomain() de la classe QCoreApplication.
- 65 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• QString getOpenFileName() : permet la récupération du chemin d'un fichier existant selectionné par
l'utilisateur ;
• QStringList getOpenFileNames() : permet la récupération du chemin de plusieurs fichiers existants selectionnés
par l'utilisateur ;
• QString getSaveFileName () : permet la récupération du chemin d'un fichier non existant dans le but d'être
sauvegardé ;
• QString getExistingDirectory() : permet la récupération d'un répertoire sélectionné par l'utilisateur.
Exemple
/* On souhaite sélectionner un fichier de type MP3 à l'aide d'une boite de dialogue avec les
contraintes suivantes:
*- Elle doit avoir comme label "Open mp3 file"
*- Elle doit s'ouvrir à partir du répertoire C:
*- Elle doit pouvoir filtrer les fichiers ayant l'extension .mp3 et aussi permettre de voir les
fichiers
ayant n'importe quelle extension*/
- 66 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• bool QDirIterator::hasNext () : retourne true tant qu'on n'est pas à la fin de l'arborescence ;
• QString QDirIterator::next () : fait avancer l'itérateur à la prochaine entrée et renvoie le chemin absolu de
celle-ci.
// On remplit une QStringList avec chacun des filtres désirés ici "*.mp3" et "*.avi".
QStringList listFilter;
listFilter << "*.avi";
listFilter << "*.mp3";
// On déclare un QDirIterator dans lequel on indique que l'on souhaite parcourir un répertoire et
ses sous-répertoires.
// De plus, on spécifie le filtre qui nous permettra de récupérer uniquement les fichiers du type
souhaité.
QDirIterator dirIterator(selectDir, listFilter ,QDir::Files | QDir::NoSymLinks,
QDirIterator::Subdirectories);
Note 1 : Si on préfère récupérer une liste de type QFileInfoList au lieu d'une QStringList, il suffit d'utiliser la méthode
QDirIterator::fileInfo ().
Note 2 : Si on souhaite lister uniquement les fichiers d'un répertoire et non ceux de ses sous-répertoires, il est préférable
d'utiliser la méthode entryInfoList() de la classe QDir.
- 67 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Remarque : Il est intéressant de préciser que le répertoire courant n'est pas forcement le même que le répertoire où
se trouve l'exécutable.
Diverses classes héritent de QIODevice : la plus connue, QFile, mais aussi QProcess, QAbstractSocket (et donc,
QTcpSocket et QUdpSocket), QBuffer...
QByteArray QIODevice::readAll();
Depuis le QByteArray, il est possible d'obtenir une QString, grâce aux constructeurs fournis. Vous pouvez aussi passer
par la méthode data() de QByteArray, qui vous permet de récupérer un char *.
Cependant, le résultat d'une telle opération peut être assez aléatoire : en effet, un QByteArray
peut contenir du texte avec n'importe quel encodage. Pour cela, il vaut mieux passer par un
QTextStream, qui permet de gérer l'encodage.
On ne peut jamais être sûr de la provenance d'un QByteArray, ni, donc, de la signification
des caractères qu'il comporte. Par exemple, un \0 revêt une signification particulière pour
QString : aux yeux de QByteArray, il s'agit d'un caractère comme les autres.
QString::QString ( QByteArray );
QTextStream::QTextStream (QByteArray );
- 68 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
QTextStream::setCodec ( QTextCodec );
//On récupère tous les lecteurs disponibles dans une liste de type QFileInfoList
QFileInfoList ListDrives = QDir::drives();
Cette méthode est aussi disponible sous Mac OS X et Linux. Cependant, elle retournera
uniquement la racine du système, c'est-à-dire /.
- 69 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Modules > QtCore > Fichiers et répertoires > Lecture et écriture
Comment écrire dans un fichier texte ?
Auteurs : François Jaffré ,
L'écriture dans un fichier texte se fait comme pour la lecture à l'aide de la classe QTextStream. Celle-ci fournit
l'opérateur << qui possède énormément de surcharges pour l'écriture dans un fichier. De plus, on peut spécifier le jeu
de caractères utilisé pour l'écriture avec la méthode QTextStream::setCodec.
Bonjour,
Nous sommes le 3 avril 2009
* Intégralement.
QString ligne;
while(! flux.atEnd())
{
ligne = flux.readLine();
//traitement de la ligne
}
- 70 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
QString mot;
while(! stream.atEnd())
{
stream >> mot;
// traitement du mot
}
La classe QTextStream offre une moyen simple d'écrire ou de lire du texte, d'en extraire ou d'ajouter des lignes, des
mots ou des nombres, un QTextStream pouvant fonctionner avec un QIODevice, une QString ou même un QByteArray.
Les opérateurs surchargé << et >> permettent d'opérer sur un QTextStream de façon très simple.
Remarque : Cette classe prend en compte l'encodage du texte.
Mais on peut aussi lire intégralement le contenu d'un fichier sans passer par la classe QTextStream, mais cela nécessite
de passer par la classe QByteArray.
data = fichier.readAll();
QString ligne(data);
while(!fichier.atEnd())
{
data = fichier.readLine();
QString ligne(data);
//traitement de la ligne
}
- 71 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
QFile file("MyFile.bin");
// Ouverture du fichier en écriture seule
if (!file.open(QIODevice::WriteOnly))
return;
// Création de notre QDataStream à partir de notre fichier précédemment ouvert
QDataStream binStream(&file);
// On spécifie la version de l'encodage qui va être utilisé par notre objet QDataStream
binStream.setVersion(QDataStream::Qt_4_4);
// On écrit nos différents objets dans le fichier
binStream << str << value << vec;
// On ferme le fichier
file.close();
QFile file("MyFile.bin");
// Ouverture du fichier en lecture seule
if (!file.open(QIODevice::ReadOnly))
return;
// Création de notre QDataStream à partir de notre fichier précédemment ouvert
QDataStream binStream(&file);
// On spécifie exactement le même type d'encodage que celui utilisé lors de l'écriture
binStream.setVersion(QDataStream::Qt_4_4);
// Lecture des différents objets contenus dans notre fichier binaire
binStream >> str >> value >> vec;
// Fermeture du fichier
file.close();
- 72 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Modules > QtCore > Fichiers et répertoires > Récupérer des informations
Comment obtenir des informations de fichiers ?
Auteurs : Thibaut Cuvelier ,
La classe QFileInfo est réservée à cet usage. Elle est prévue pour pouvoir être utilisée sous toutes les plateformes de
la même manière.
Avant de pouvoir voir les informations d'un fichier, vous devez créer un objet QFileInfo. Pour ce faire, il y a trois
manières de procéder.
• QString ("/home/qt/bin/qmake")
• QString ("/home/./qt/lib/../bin/qmake")
• QString ("./../../home/./qt/lib/../bin/qmake") (si vous vous situez au deuxième niveau d'arborescence dans un
point de montage)
Ensuite, vous pourrez utiliser les méthodes de QFileInfo pour récupérer les informations qui vous sont nécessaires.
Pour récupérer les informations des fichiers contenus dans un dossier QDir fournit la méthode QDir::entryInfoList().
Cette méthode prend en paramètres des filtres permettant de sélectionner le type de fichier requis.
Grâce aux caching des QFileInfo dans QDir, il est plus efficace d'utiliser cette méthode que de créer manuellement un
QFileInfo sur chacun des fichiers.
- 73 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
QDir dir("/developpez/");
foreach(QFileInfo &fileInfo, dir.entryInfoList()) {
fileInfo->isBundle();
}
QFileInfo file("/tmp/archive.tar.gz");
file.baseName() // == QString("archive")
file.suffix() // == QString("gz")
file.completeSuffix() // QString("tar.gz")
isDir() retournera true si le QFileInfo pointe vers un dossier ou vers un lien symbolique sur un dossier.
isFile() retournera true si le QFileInfo pointe vers un fichier ou vers un lien symbolique sur un fichier.
isSymLink() retournera true si le QFileInfo pointe vers un lien symbolique ou vers un raccourci (sous Windows
uniquement).
Sous Windows, quand vous ouvrez un raccourci, c'est le fichier .lnk qui est ouvert, et non le
fichier vers lequel il pointe.
QFileInfo file("/tmp/archive.tar.gz");
file->isDir() // == false
file->isFile() // == true
file->isSymLink // == false
- 74 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
usr->isSymLink // == false
Il existe une fonction pour récupérer les droits par droit : isReadable(), isWritable(), isExecutable(), en rapport avec
l'utilisateur qui lance votre programme. Il existe aussi la fonction permissions() qui permet de récupérer tous ces droits
pour tous, pour un groupe, pour un utilisateur et pour le possesseur.
if ( file.isReadable() )
// Opération de lecture sur fichier
if ( file.isWritable() )
// Opération d'écriture sur le fichier
if ( file.isExecutable() )
// Opération d'exécution sur le fichier
if ( file.permissions() &QFile::ReadUser )
// Opération de lecture sur le fichier
Quand vous utilisez un système de fichier NTFS (par défaut sous Windows NT), les droits ne
sont pas vérifiés, car cela prend trop de temps. Si vous désirez que Qt les vérifie quand même,
insérez cette ligne dans votre code.
Ensuite, pour demander la vérification, il faut incrémenter qt_ntfs_permission_lookup. Pour la désactiver, il suffit de
le décrémenter.
qmake.absoluteFilePath() // == QString("/home/qt/bin/qmake")
qmake2.absoluteFilePath() // == QString("/home/./qt/lib/../bin/qmake")
qmake3.absoluteFilePath() // == QString("/home/./qt/lib/../bin/qmake")
qmake4.absoluteFilePath() == QString("C:/Qt/4.5.2/bin/qmake.exe")
- 75 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
qmake.absolutePath() // == QString("/home/qt/bin/")
qmake2.absolutePath() // == QString("/home/./qt/lib/../bin/")
qmake3.absolutePath() // == QString("./../../home/./qt/lib/../bin/")
qmake4.absolutePath() == QString("C:/Qt/4.5.2/bin")
qmake.canonicalPath() // == QString("/home/qt/bin/")
qmake2.canonicalPath() // == QString("/home/qt/bin/")
qmake3.canonicalPath() // == QString("/home/qt/bin/")
qmake4.canonicalPath() == QString("C:/Qt/4.5.2/bin")
qmake.canonicalFilePath() // == QString("/home/qt/bin/qmake")
qmake2.canonicalFilePath() // == QString("/home/qt/bin/qmake")
qmake3.canonicalFilePath() // == QString("/home/qt/bin/qmake")
qmake4.canonicalFilePath() == QString("C:/Qt/4.5.2/bin/qmake.exe")
La classe QFileInfo propose quelques fonctions spécialisées dans la gestion de ces bundles.
file.isBundle() // == true
file.bundleName() // == QString("Safari")
QFileInfo file("/tmp/archive.tar.gz");
qDebug() << "File \"" << file.fileName() << "\" was modified on " ;
qDebug() << lastModified.date().toString("mm/dd/yyyy") << " at ";
- 76 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
qint64 size;
size = file.size();
qint64 size;
size = file.size();
Si vous essayez de rapatrier la taille d'un fichier vide sous UNIX (comme /proc), la fonction
retournera 0. Le contenu sera généré lors de l'appel à read().
- 77 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Cette classe émet le signal started() lorsqu'un thread est lancé et finished() lorsque le thread est terminé.
- 78 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Remarque : Qthread fournit aussi un slot nommé terminate() qui termine brutalement le thread. Cette fonction est à
éviter le plus possible.
C'est pour cela que Qt oblige les traitements IHM dans le thread principal (celui exécutant le main() du programme).
Attention, cette vérification n'est effectuée uniquement par des assertions, en compilation débug.
Si vous devez manipuler l'affichage par un thread, utilisez le système de connexion signal/slot.
Par défaut, cette affinité dépend du thread qui créé le QObject. Le QObject prendra le QThread qui interface ce thread.
Attention, lorsque l'on créé un QObject, le parent doit être associé au QThread interfaçant le thread.
#include <QtGui>
QObject obj4(this);
}
};
- 79 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
obj1 et obj2 sont créés par le thread principal et sont associés au même QThread que QApplication. obj3 est créé dans
le thread interfacé par QThread et est associé au QThread. obj4 génère un avertissement et son parent est 0.
Il est possible de transférer l'appartenance d'un QObject entre QThread grâce à la méthode moveToThread(). Attention
à ces quelques règles !
• QtConcurrent : un ensemble d'algorithmes simplifiant énormément l'utilisation des threads. Il partage un pool
de threads qui s'adaptera à la machine d'exécution.
• QThread : c'est un classe qui interface un thread. Elle va créer, stopper, faire exécuter sa méthode run() et
autres opération sur un thread.
• QThreadPool : pour optimiser la création de threads, il est possible de manipuler un pool de thread avec
QThreadPool. Ce pool de threads exécutera des classes héritant de QRunnable et réimplementant la méthode
run().
• Ne jamais utiliser un pointeur ou une "référence non const" dans les signatures des signaux/slots. Rien ne
permet de certifier que la mémoire sera encore valide lors de l'exécution du slot ;
• S'il y a une référence const, l'objet sera copié ;
• Il est préférable d'utiliser des classes Qt car elles implémentent une optimisation de la copies (cf COW).
- 80 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
void desConnect()
{
qRegisterMetaType <A>("A");
// Connexion entre deux objets de deux threads
connect( unObjet, SIGNAL( unSignal(const A &), unObjetDansUneAutreThread, SLOT(monSlot(const A
&)));
connect( unObjet, SIGNAL( unSignal2(A ), unObjetDansUneAutreThread, SLOT(monSlot2(A )));
}
Contrairement aux slots, les signaux sont thread safe et peuvent donc être appelés par n'importe quel thread.
Afin de simplifier sa manipulation, Qt fournit la classe QMutexLocker basée sur le pattern RAII qui permet de
manipuler correctement le mutex et éviter certains problèmes (un thread qui essaye de bloquer deux fois un mutex, un
mutex non débloqué suite à une exception...). QMutexLocker va bloquer le mutex lors de sa création et le libérer lors
de sa destruction. Il permet aussi de libérer (unlock()) et de rebloquer (relock()) le mutex.
QMutexLocker vs à la main
QMutex lock;
QMutex lock2;
void f()
{
// locker bloque le mutex lock
QMutexLocker locker(lock);
// on bloque le mutex lock2
lock2.lock();
Lorsqu'une ressource est partagée entre plusieurs threads, ces threads ont le droit d'accéder parallèlement à la ressource
uniquement s'ils ne font que des accès en lecture. Ainsi, pour optimiser les accès, Qt fournit QReadWriteLock, qui
est un autre mutex, beaucoup plus adapté. Contrairement à QMutex, QReadWriteLock va différencier les lock() en
lecture et écriture :
- 81 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
De la même manière que QMutexLocker, Qt fournit deux classes qui simplifient la manipulation de ce mutex.
• Ne possède aucun slot, car elle ne doit pas accéder aux objects manipulés par le thread ;
• Définira, au besoin, des signaux dans sa définissions de base, appelés des signaux sortantd ;
• Définira, au besoin, à la place des slots, des signaux qui serviront de passerelle vers les slots des objets utilisés
par le thread, appelés des signaux entrant ; dans ce cas il faut utiliser la boucle d'événements.
#include <QtCore>
// Simple class qui émet toutes les secondes un entier incrémenté
// Comme un signal est thread safe, le thread appelera le signal de QThread
class threadEmetteur : public QThread
{
Q_OBJECT
protected:
- 82 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
void run()
{
int i=0;
forever
{
sleep(1);
qDebug()<<"Emission de " << i << " depuis le thread " << (int) currentThreadId();
emit unEntier(i++);
}
}
signals:
// Émet un entier
void unEntier(int);
};
public slots:
// Slot qui affichera un entier reçu
void afficheEntier(int i)
{
qDebug() << "Recu " << i << " depuis le thread " << (int) QThread::currentThreadId();
}
};
// Le second thread doit recevoir des signaux et les renvoie vers un objet interne
class threadReceveur : public QThread
{
Q_OBJECT
protected:
void run()
{
// Création de l'objet interne
interthreadReceveur receveur;
// Connexion des signaux entrant vers les slots d'exécutions
connect(this,SIGNAL( afficheEntier(int)),&receveur,SLOT( afficheEntier(int)));
// Lancement de la boucle d'événements
exec();
}
signals:
// Signal entrant qui sera redirigé vers l'objet interne
void afficheEntier(int i);
};
#include "main.moc"
int main(int argc,char**argv)
{
QCoreApplication app(argc,argv);
threadEmetteur te;
threadReceveur tr;
// Connexion d'un signal sortant vers un signal sortant
QObject::connect(&te,SIGNAL( unEntier(int)),&tr,SIGNAL(afficheEntier(int)));
tr.start();
te.start();
return app.exec();
}
- 83 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
On pourrait être tenté d'utiliser la fonction moveToThread sur le QThread en début du run()
pour exécuter ses slots dans le thread. Seulement, cela poserait des problèmes : par exemple,
pour redémarrer le thread après une première exécution, si vous utilisez start() comme un slot.
Lorsqu'un thread fait énormément de traitements, il a tendance à récupérer le maximum de temps CPU. Les autres
threads se retrouvent ainsi fortement ralentis voire en attente constante de temps CPU. Il existe quelques solutions pour
résoudre ce problème :
• La façon la plus simple est de diminuer la priorité d'exécution du thread. Pour ceci, il vous suffit d'utiliser la
fonction QThread::setPriority() avec une priorité inférieure ou égale à QThread::LowPriority.
• La seconde méthode est de mettre en pause régulièrement le thread. Lorsque le thread est en pause, l'OS va
récupérer le CPU utilisé par le thread et exécuter un autre thread. Une fois le thread réveillé, il est mis en
attente. Le problème de cette méthode est qu'il est assez difficile de déterminer le temps de pause à appliquer. Si
le temps de pause est trop faible, le thread va garder l'utilisation du CPU et cela ne règlera pas le problème. Si
le temps est trop long, le thread peut être ralenti inutilement.
• Depuis la version 4.5, QThread fournit une méthode publique statique assez intéressante :
QThread::yieldCurrentThread(). Avec cette méthode, contrairement à la mise en pause, le thread redonne la
main du CPU à l'OS et se met en attente. L'OS choisissant quel thread sera exécuté. Ainsi le temps CPU sont
toujours libérées régulièrement et théoriquement partagés. De la même manière, il est très difficile d'évaluer la
fréquence à utiliser pour appeler cette méthode.
- 84 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 85 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• int interval () const : permet de connaitre l'intervalle de temps (en ms) entre chaque déclanchement du timer.
• bool isActive () const : permet de connaitre si le timer est activé ou pas.
• bool isSingleShot () const : permet de connaitresi le timer est en déclanchement unique ou pas.
• void setInterval ( int msec ) : permet de paramétrer l'intervalle (en ms) entre chaques déclanchements du timer
• void setSingleShot ( bool singleShot ) : permet de mettre le timer en mode déclanchement unique
• void start () : permet de démarrer le timer
• void stop () : permet d'arrêter le timer
private :
// Bouton servant de "Start" "Stop"
QPushButton* m_Bouton_StartStop;
// Bouton "Reset"
QPushButton* m_Bouton_Reset;
// Afficheur de type LCD
QLCDNumber* m_LCD;
// Variable représentant le nombre de secondes écoulées depuis le lancement du timer
int m_Timer_value;
// Timer servant de base à notre Chronomètre
QTimer* m_timer;
// Permet de savoir si l'utilisateur a cliqué sur "Start" ou "Stop"
bool validStart;
public :
TimerChrono()
{
// Création d'un afficheur LCD de 5 digits maximum
this->m_LCD = new QLCDNumber(5, this);
// Création des contrôles de type bouton
this->m_Bouton_StartStop = new QPushButton("Start",this);
this->m_Bouton_Reset = new QPushButton("Reset",this);
- 86 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
private slots:
// Fonction appelée toute les secondes par le QTimer
void update()
{
// On incrémente notre compteur de secondes
m_Timer_value++;
// On affiche le nombre de secondes écoulées dans le contrôle QLCDNumber
m_LCD->display(m_Timer_value);
}
// Bouton reset
void click_Reset(bool valid)
{
// On arrête le timer
this->m_timer->stop();
// On met notre compteur à zéro
m_Timer_value=0;
// On affiche zéro dans le controle LCD
m_LCD->display(m_Timer_value);
// Gestion du bouton "Start" "Stop"
this->validStart=true;
m_Bouton_StartStop->setText("Start");
}
#include "main.moc"
Remarque 1 : Si vous souhaitez utiliser un timer en mode "single shot" QTimer possède une méthode statique
QTimer::singleShot(), qui peut vous être très utile.
- 87 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Remarque 2 : Un timer n'est jamais très précis et est fortement dépendant de l'OS. Si vous souhaitez être précis à la
milliseconde, ce n'est pas la solution à utiliser.
QTime time;
time.start();
ma_fonction();
// millisecondes contient le nombre de millisecondes entre l'appel à la fonction start()
// et l'appel 0 la fonction elapsed()
int millisecondes = time.elapsed();
Remarque : si vous voulez vraiment mesurer précisément votre code et faire du benchmarking de votre application,
alors il est préférable de vous tourner vers QTestLib, qui est faite pour ça.
Qt nous propose une manière sympathique de convertir en chaîne de caractères les données contenues par un QDate
via la méthode toString(QString& format). Grâce à l'argument format, il nous est possible de d'indiquer le format de
cette chaîne de caractères. Cet argument peut se composer de ces différents sigles.
- 88 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Comme nous pouvons le constater avec le troisième exemple, il est possible d'ajouter du texte personnalisé dans
l'argument de la méthode toString(). Ce texte doit être entouré par des ' (apostrophe) et sera restitué dans le résultat,
à la position indiquée.
Pour afficher le caractère ' (apostrophe), il faut écrire '' (deux apostrophes consécutives).
Qt nous propose une manière sympathique de convertir en chaîne de caractères les données contenues par un QTime
via la méthode toString(QString& format). Grâce à l'argument format, il nous est possible de d'indiquer le format de
cette chaîne de caractères. Cet argument peut se composer de ces différents sigles.
L'heure contenue par QTime heure est 14:13:09.042 (14 heures, 13 minutes, 9 secondes et 42 millièmes de seconde).
- 89 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• QString QLocale::toString ( const QDate & date, const QString & format ) const
• QString QLocale::toString ( const QTime & time, const QString & format ) const
Il est possible de ne pas définir de format, auquel cas Qt affichera la date au format classique
du pays.
On suppose que la date est définie dans la variable QDate date. On choisit le format d'écriture ddd d MMMM yy.
QLocale francais("fr_FR");
francais.toString(date, "ddd d MMMM yy"); //Affiche la date en français
QLocale anglaisUS("en_US");
anglaisUS.toString(date, "ddd d MMMM yy"); //Affiche la date en anglais (Etats-Unis).
QLocale anglaisGB("en_GB");
anglaisGB.toString(date, "ddd d MMMM yy"); //Affiche la date en anglais (Royaume-Uni).
QLocale coreen("ko");
coreen.toString(date, "ddd d MMMM yy"); //Affiche la date en coréen
QLocale allemandSuisse("de_CH");
allemandSuisse.toString(date, "ddd d MMMM yy"); //Affiche la date en allemand (Suisse)
- 90 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Il y a deux manières d'insérer les ressources : soit directement dans l'exécutable, soit dans un fichier de ressources
binaire. Dans les deux cas, un fichier QRC doit être utilisé, et compilé avec RCC.
Vous pouvez intégrer ces fichiers dans l'exécutable : il suffit d'indiquer, dans votre fichier de projet, le fichier de
ressources, et qmake s'occupe, encore une fois, de tout.
RESOURCES = application.qrc
Cette méthode ne fonctionne pas toujours. Voici un exemple où vous êtes obligé d'utiliser la méthode alternative.
Vous pouvez aussi compiler le fichier de ressources pour avoir un fichier de ressources binaire.
Avant de pouvoir utiliser le fichier créé dans votre application, il faudra l'enregistrer.
QResource::registerResource("/path/to/myresource.rcc");
Avec cette ligne, vous pourrez utiliser les ressources contenues dans le fichier binaire comme n'importe quelle ressource.
<qresource>
<file>cut.jpg</file>
</qresource>
<qresource lang="fr">
<file alias="cut.jpg">cut_fr.jpg</file>
</qresource>
- 91 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Quand la langue de l'application sera le français, les références à :/cut.jpg seront redirigées vers :/cut_fr.jpg.
Il n'est pas possible de modifier une ressource d'un programme pendant que ce dernier
tourne. En effet, le système de ressources n'est pas prévu pour cela, seule la lecture est
possible. Ce qui s'explique assez facilement : un exécutable ne peut pas se modifier lui-même
pendant qu'il tourne.
- 92 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 93 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 94 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
[EquipeQt]
membre1=dourouc05
membre2=Amnell
membre3=IrmatDen
[ModerateursQt]
moderateur1=yan
moderateur2=superjaja
// Création du fichier en précisant que l'on travaille avec un fichier de format INI.
QSettings settings("Developpez.ini", QSettings::IniFormat);
- 95 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 96 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
La fonction start() crée un processus enfant (qui sera fermé si le processus parent est fermé) avec, pour paramètres :
• Le path de l'exécutable,
• La liste des paramètres d'entrée de l'exécutable,
• Un mode d'ouverture pour interagir avec l'application par le biais des entrées/sorties standards.
• Ont des paramètres similaires à ceux de start() : le path de l'exécutable, et la liste des paramètres d'entrée de
l'exécutable ;
• Ne donnent pas de moyen pour interagir avec le process par le biais des entrées/sorties standards ;
• Ces deux fonctions sont des fonctions statiques et peuvent être appelées sans création d'un QProcess. Dans
ce cas, les variables d'environnement et le répertoire d'exécution seront les mêmes que ceux de l'application
courante.
private :
QString m_exe;
- 97 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
QProcess utilise les méthodes définies par QIODevice pour ces interactions. Pour la récupération des sorties, il faut
faire attention au channel que l'on est en train de lire.
De plus QProcess fournit deux signaux intéressants, qui indiquent si des données venant d'une des sorties sont arrivées.
• readyReadStandardOutput () : des données provenant de la sortie standards sont prêtes à être traitées
• readyReadStandardError () : des données provenant de la sortie d'erreur sont prêtes à être traitées
- 98 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sous Windows XP, un programme lisant l'entrée standard (stdin) en parallèle de son IHM,
peut se bloquer lorsqu'il est exécuté en process enfant. Ce bug est normalement corrigé sous
vista.
- 99 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 100 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Une collision, c'est deux données qui ont le même hash. Le temps qu'il faut pour trouver une collision détermine la
sécurité d'un algorithme de hashage. On peut calculer des collisions pour les deux premiers en moins d'une minute sur
un ordinateur moyen, contrairement aux 235 opérations requises pour SHA1 (34 359 738 368 opérations, précisément).
Chercher un moyen de trouver des collisions s'appelle la cryptanalyse
Cependant, pour des besoins évolués (système banquaire, authentification sur un site), SHA1 ne convient plus, et doit
être remplacé par un algorithme plus performant, comme Whirlpool ou RipeMD-160, pour lesquels on ne connaît pas
encore de méthode pour trouver des collisions.
Qt ne supporte pas nativement d'autres algorithmes de hashage. Pour pallier ce manque, la communauté fournit QCA
(Qt Cryptographic Architecture). Cette bibliothèque se base sur Qt, et lui fournit moult autres fonctionnalités orientées
vers la sécurité.
Tous les algorithmes de hashage seront, un jour ou l'autre, cryptanalysés, et on pourra trouver assez facilement des
collisions avec un ordinateur moyen. C'est pour ça que, sans cesse, des comités cherchent les failles, et développent de
nouveaux algorithmes.
On peut utiliser cette classe de manière statique, sans instancier d'objet. Pour cela, on peut utiliser la méthode hash().
Voici son prototype.
On peut aussi instancier l'objet, si on ne peut pas préciser toutes les données d'un seul coup.
Pour ajouter des données à hasher, les méthodes addData() doivent être utilisées. Voici leurs prototypes.
- 101 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• QPointer (4.0) ;
• QSharedDataPointer (4.0) ;
• QExplicitlySharedDataPointer (4.3) ;
• QSharedPointer (4.5) ;
• QWeakPointer (4.5) ;
• QScopedPointer (4.6).
Chacun de ces pointeurs a une signification particulière, un emploi particulier. Avant d'aller plus en avant, il faut savoir
ce qui distingue les pointeurs intelligents, mais aussi à quoi ils servent.
Un pointeur intelligent permet de garder une référence à un objet, en s'assurant qu'il sera détruit à un certain moment.
Ils peuvent être utilisés par plusieurs objets en même temps, pour, par exemple, éviter d'utiliser trop de mémoire.
Principalement, ils peuvent partager des données ou un pointeur sur les données. Un pointeur intelligent pourrait donc
contenir un pointeur ? Oui : cela peut être utile lorsqu'un objet est partagé par plusieurs objets. Ainsi, l'objet référencé
n'est stocké qu'une fois en mémoire.
Ensuite, leur référence peut être légère ou forte. La référence forte implique que l'objet ne soit pas détruit, cela est
garanti par le pointeur intelligent. Tant qu'il existe, l'objet existe. Tandis qu'un pointeur à référence légère (weak
pointer) ne peut le garantir : il faut s'assurer qu'il ne sera pas détruit par d'autres moyens.
QPointer est un pointeur intelligent assent lent, c'est pour cela qu'on lui préfère de loin QWeakPointer.
Il ne reste donc que 4 pointeurs intelligents, correspondant aux 4 combinaisons possibles des caractéristiques présentées
Classe Description
QSharedDataPointer & Partage de données (implicite et explicite)
QExplicitelySharedDataPointer
QSharedPointer Partage à comptage de référence de
pointeurs à référence forte
QWeakPointer Partage à comptage de référence de
pointeurs à référence faible
QScopedPointer & QScopedArrayPointer Emballage sans comptage de référence de
pointeurs à référence forte
- 102 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 103 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 104 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 105 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Il s'agit d'une suite de fenêtres, contenant des formulaires, dont les données sont gardées, et peuvent servir à choisir
la fenêtre suivante.
Pour garder les données, vous pouvez créer un nouveau type d'objet, avec uniquement des accesseurs et des variables
membres privées. Quand l'utilisateur validera un formulaire, les setters seront utilisés pour écrire les données du
formulaire. Quand vous devrez personnaliser un formulaire, vous utiliserez les getters pour récupérer les données qui
vous intéressent.
• Quand vous utilisez la première, lors du changement de fenêtres, elle va disparaître et une nouvelle apparaîtra,
à la fin de la barre des tâches.
• Si vous détruisez vos fenêtres ou vous widgets, cela prendra du temps, mais aussi, et surtout, cela évitera de
prendre trop de mémoire ;
• Au niveau implémentation, les différences peuvent être énormes en termes de longueur.
Premièrement, vous créerez, probablement, un objet qui va s'occuper de la gestion des fenêtres et des widgets. Celui-ci
disposera alors de slots qui vont vous permettre de passer d'une fenêtre à l'autre. Ces slots seront connectés aux signaux
des widgets "Suivant" et "Précédent" des fenêtres.
Si vous utilisez la première solution, les slots ne feront que détruire une fenêtre, et en construire une autre.
Si vous utilisez la seconde, les slots devront cacher tous les anciens widgets, construire et afficher tous les nouveaux.
Deuxièmement, dans cet objet de gestion de l'assistant, vous stockerez des pointeurs vers vos fenêtres (première
solution), ou vers tous les widgets qui vont être utilisés (deuxième solution).
Qt gère lui-même tout cela de manière interne, grâce à la famille de classes QWizard.
Cette classe ne contient elle-même que la logique de l'assistant : toutes les pages sont des QWizardPage, que vous liez
avec un ou plusieurs QWizard.
Voici une utilisation très basique de cette classe, avec trois pages qui se suivent dans l'ordre d'enregistrement auprès
du QWizard.
- 106 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Notez que nous aurions pu créer des classes héritant de QWizardPage, et en proposer une instance à QWizard, au lieu
de créer des fonctions qui s'occupent de les instancier. Cette dernière technique permet de simplifier le code ; tandis
que l'héritage permet de personnaliser encore plus les pages.
QWizardPage *createIntroPage()
{
QWizardPage *page = new QWizardPage;
page->setTitle("Introduction");
QLabel *label = new QLabel("Cet assistant va vous aider à enregistrer votre copie du
logiciel.");
label->setWordWrap(true);
return page;
}
QWizard wizard;
wizard.addPage(createIntroPage());
wizard.addPage(createRegistrationPage());
wizard.addPage(createConclusionPage());
wizard.setWindowTitle("Assistant simple");
wizard.show();
return app.exec();
}
Une page est constituée, comme toute fenêtre, de widgets. Ces widgets peuvent être rassemblés en layouts : par exemple,
des boîtes (QBoxLayout : QHBoxLayout, QVBoxLayout), des formulaires ( QFormLayout), des grilles (QGridLayout)...
Vous devez associer tous les widgets de la page en layouts, que vous pouvez ajouter simplement grâce à la méthode
setLayout().
Cette classe hérite de QWidget : vous pouvez donc utiliser l'ensemble des méthodes de cette classe pour personnaliser
votre page.
Si vous devez personnaliser encore plus votre page, vous pouvez hériter de QWizardPage, et redéfinir ses méthodes
pour obtenir le résultat souhaité.
- 107 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
QLabel *label = new QLabel("Cet assistant va vous aider à enregistrer votre copie du logiciel.");
Pour cela, il vous faut installer un QTranslator dans votre QApplication, et lui préciser le fichier dans lequel se situent
les traductions. Cette méthode est applicable pour toutes les applications.
QWizard wizard;
wizard.addPage(new QWizardPage());
wizard.setWindowTitle(tr("Titre"));
wizard.show();
return app.exec();
La méthode setWizardStyle() vous permettra de choisir entre ces quatre styles, s'ils ont été compilés en même temps
que Qt :
Ces styles sont définis dans une énumération, WizardStyle, que voici.
- 108 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
MacStyle
- 109 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
wizard()->setTitle( QString() );
wizard()->setSubTitle( QString() );
wizard()->setOption(QWizard::IgnoreSubTitles, true);
- 110 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Les autres éléments modifiables sont des images. Ces images peuvent être finement modifiés, c'est-à-dire que cette
méthode est aussi disponible sur les QWizardPage. La méthode à utiliser est setPixmap().
Elle prend deux paramètres : le premier, l'image à modifier ; le second, le QPixmap qui va être utilisé.
WizardButton
{
BackButton,
NextButton,
CommitButton,
FinishButton,
CancelButton,
HelpButton,
CustomButton1,
CustomButton2,
CustomButton3,
Stretch
}
Vous pouvez personnaliser tous les boutons, et même ajouter trois bouton entièrement personnalisés.
Pour modifier un bouton, vous pouvez utiliser la méthode setButton(). Pour modifier son texte, setButtonText(). Pour
modifier son layout, setButtonLayout().
Chacune de ces fonctions prend, en premier paramètre, le rôle du bouton que vous voulez modifier.
Quand vous spécifiez un bouton personnalisé, il n'est affiché que si vous demandez à Qt de l'afficher. Pour cela, vous
devez utiliser la méthode setOption().
wizard()->setOption(QWizard::HaveCustomButton1, true);
Le signal customButtonClicked() est émis lorsqu'un bouton personnalisé est enfoncé. Son paramètre est le rôle du
bouton enfoncé
- 111 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• Masque : à partir d'une image binaire (QBitmap), il est possible de spécifier quelle partie est visible ou non
sur la fenêtre. Cette méthode s'applique à tous les éléments d'une fenêtre top-level. Par exemple la partie d'un
bouton qui se trouve dans une zone transparente ne sera pas dessinée. Pour utiliser un masque il faut créer une
QBitmap et utiliser la fonction setMask (définie par QWidget) sur le widget parent. Sur certains OS comme
Windows XP, il est obligatoire d'enlever la décoration avec le flag Qt::FramelessWindowHint.
• Opacité : permet de rendre translucide toute une fenêtre. Pour cela il faut utiliser la méthode
setWindowOpacity() (définie par QWidget) sur le widget parent. Cette méthode prend en paramètre une valeur
réelle entre 0 (transparent) et 1 (opaque).
• Transparence : depuis la version 4.5, il est possible de spécifier que le background de la widget parente soit
transparent. Il est ainsi possible de jouer avec la transparence des différents éléments et QPainter pour créer
une fenêtre translucide. Contrairement aux deux autres méthodes, ceci ne s'applique qu'au background de la
fenêtre parente et les éléments enfants ne sont pas modifiés. Pour utiliser cette option, il faut activer l'attribut
Qt::WA_TranslucentBackground sur le widget parent : setAttribute( Qt::WA_TranslucentBackground,
true);. Sur certains OS comme Windows XP, il est obligatoire d'enlever la décoration avec le flag
Qt::FramelessWindowHint.
// base
// drag & drop sur le widget pour le déplacer
// bouton fermer pour fermer l'application
// dessine un dégradé RGBA en fond
class BaseWidget : public QWidget
{
// position dans le repère widget de click gauche
QPoint p;
QPolygon polygon;
QLinearGradient gradient;
public:
BaseWidget()
:QWidget
(
0,
// enlève la décoration Windows et l'entrée dans la barre de tâche
Qt::FramelessWindowHint | Qt::SubWindow
)
{
resize(200,200);
- 112 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
// initialisation du gradient
gradient.setStart (0. , 0.);
gradient.setFinalStop (size().width() , 0.);
{
// Gradienstops pour varier l'apha et la couleur du gradient
QGradientStops gs;
gs <<QGradientStop(0. , QColor(50 , 0 , 50 , 255))
<<QGradientStop(.5 , QColor(0 , 255 , 255 , 100))
<<QGradientStop(1. , QColor(50 , 50 , 0 , 255));
gradient.setStops (gs);
}
}
protected:
void mousePressEvent ( QMouseEvent * mouseEvent )
{
// sauvegarde du point dans le repère widget lors du clic gauche
if(mouseEvent->buttons() == Qt::LeftButton) p = mouseEvent->pos();
}
void mouseMoveEvent ( QMouseEvent * mouseEvent )
{
// repositionne la fênetre en fonction de la postion de la souris
if(mouseEvent->buttons() & Qt::LeftButton) move( mouseEvent->globalPos() - p);
}
protected:
void paintEvent(QPaintEvent * )
{
QPainter p(this);
p.setPen(Qt::NoPen);
// utilisation d'un gradient linéaire entre deux coins de la fenêtre
p.setBrush(gradient);
p.drawPolygon(polygon);
}
};
- 113 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 114 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
MaskWidget maskWidget;
maskWidget.show();
maskWidget.move(300,50);
OpacityWidget opacityWidget;
opacityWidget.show();
opacityWidget.move(50,300);
CompositionWidget compositionWidget;
compositionWidget.show();
compositionWidget.move(300 , 300);
return app.exec();
}
Voici, par exemple, comment utiliser le style Plastique pour toute l'application.
QApplication::setStyle(new QPlastiqueStyle);
Remarque : il est possible de créer un style par son nom avec QStyleFactory::create() ou la fonction statique
QApplication::setStyle().
Créer un style complet est généralement une tâche difficile. Heureusement, Qt fournit un mécanisme simple pour
personnaliser les styles : les CSS (Cascading Style Sheets). Avec CSS pour Qt, il est possible de personnaliser le
design d'une application à l'aide d'une syntaxe simple dérivée du CSS. Cela peut se faire au niveau de designer, ou
comme pour les styles classiques, au niveau des widgets ou de l'application.
QLineEdit:enabled {
background: green;
}
QLineEdit:!enabled {
background: grey;
}
QComboBox::drop-down {
subcontrol-origin: padding;
subcontrol-position: top right;
width: 50px;
border-radius: 0;
- 115 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
En général, il est déconseillé de changer de style, car l'application perd son intégration avec
le reste du système.
QLabel label;
QPixmap pixmap;
pixmap.load("image.jpg");
label->setPixmap(pixmap);
QWidget widget;
QPalette palette;
palette.setBrush(this->backgroundRole(), QBrush(QImage("image.jpg")));
this->setPalette(palette);
QWidget widget;
QString stylesheet("QWidget{ background-image: url(image.jpg); }");
widget.setStyleSheet(stylesheet);
Ces solutions peuvent être utilisés sur tous types de widgets : un bouton, un menu, une fenêtre... Elles ne mettront qu'une
image en arrière-plan, elles n'inséreront pas une image dans le widget (comme le bouclier de Windows Vista).
- 116 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Il est également possible de récupérer cette feuille de style avec la fonction styleSheet(), qui renvoie une variable de type
QString. De plus, les styles appliqués à un widget sont aussi appliqués à ses widgets enfants.
Ici, l'emploi du nom permet d'appliquer une feuille de style à un seul et unique widget.
Cette méthode peut aussi être utilisée sur un QApplication, de sorte que la feuille de style soit
appliquée à la totalité de l'application.
La définition d'une feuille de style sur un widget a pour conséquence que tous les enfants de
celui-ci en héritent. Par exemple, si vous définissez une telle feuille pour un QFrame, tous
les éléments du QFrame en hériteront et seront modifiés en conséquences.
- 117 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Modules > QtGui > Généralités > Police d'écriture
- 118 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
#include <QtGui>
• QImage est prévue pour et optimisée pour l'E/S, pour l'accès direct aux pixels et leur manipulation ; elle peut
aussi être utilisée comme painter ;
• QPixmap est prévue et optimisée pour l'affichage d'images à l'écran - elle peut d'ailleurs être utilisée comme
painter ;
• QBitmap dérive de QPixmap et n'autorise une profondeur que d'un seul bit (un QBitmap ne peut donc stocker
que des images en deux couleurs - généralement, le blanc et le noir) ;
• QPicture est un painter qui enregistre et rejoue des commandes QPainter.
La méthode la plus simple est de créer un QMovie avec le GIF et de l'associer à un label.
#include <QtGui>
- 119 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
movie.start ();
w.show();
return app.exec();
}
Il faut tout de même préciser que la compilation du plug-in GIF est nécessaire pour que ce code fonctionne correctement.
- 120 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
};
// astuce pour ne pas avoir plusieurs fichiers
#include "main.moc"
- 121 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
// on choisit l'image
QIcon icon(m_lImages[pourcent%m_lImages.size()]);
// modifie l'icône du bouton
m_but->setIcon(icon);
// modifie l'icône du systray
m_sysTray.setIcon(icon);
m_sysTray.show();
// modifie l'icône de la fenêtre
setWindowIcon(icon);
}
};
//astuce pour ne pas avoir plusieurs fichiers
#include "main.moc"
3- Un QPainter
• À chaque événement qui demande un changement de l'icône, on crée une nouvelle image avec un QPainter.
• La plus compliquée à mettre en place mais la plus puissante.
• La création d'une nouvelle icône peut mettre du temps.
- 122 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
m_trayIcon.show();
}
private slots :
// haut de l'image
QRect target(0, 0, resultImage.width(), percent_1*resultImage.height());
QRect source(0, 0, m_pix1.width(), percent_1*m_pix1.height());
painter.drawPixmap(target, m_pix1, source);
// bas de l'image
QRect target2(0, percent_1*resultImage.height(), resultImage.width(),
percent_2*resultImage.height());
- 123 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
// pourcentage
painter.setPen(QPen(Qt::black));
painter.setFont(QFont("TAHOMA",80,20));
painter.drawText(10,resultImage.height()/2,QString::number(percent));
}
QIcon iconeCourante(resultImage);
//affichage dans un label
m_Aresult->setPixmap(resultImage);
//affichage sous forme d'icone dans un bouton
m_AresultIcone->setIcon(iconeCourante);
//icone de la fenetre
setWindowIcon (iconeCourante);
//icone du systray
m_trayIcon.setIcon(iconeCourante);
}
void OpenPix1()
{
static QString s;
s =QFileDialog::getOpenFileName
(
this,
"image 1",
s,
"images (*.jpg *.png *.bmp *.gif)\n *.*"
);
if (! s.isEmpty())
{
QPixmap tmp(s);
m_pix1 = tmp.scaled(200,200,Qt::KeepAspectRatio);
m_Apix1->setPixmap(m_pix1);
}
}
void OpenPix2()
{
static QString s;
s =QFileDialog::getOpenFileName
(
this,
"image 2",
s,
"images (*.jpg *.png *.bmp *.gif)\n *.*"
);
if (! s.isEmpty())
{
QPixmap tmp(s);
m_pix2 = tmp.scaled(200,200,Qt::KeepAspectRatio);
m_Apix2->setPixmap(m_pix2);
}
}
private :
QPixmap m_pix1;
QPixmap m_pix2;
QLabel * m_Apix1;
QLabel * m_Apix2;
QSystemTrayIcon m_trayIcon;
QPushButton * m_AresultIcone;
QLabel * m_Aresult;
};
#include "main.moc"
- 124 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
QApplication app(argc,argv);
myWindows w;
w.show();
return app.exec();
}
Dans ce code, nous commençons par émettre une condition vérifiant si le nom de fichier passé en tant qu'argument string
de la fonction correspond bien à un chemin vers un fichier existant. Si c'est le cas, on retourne l'icône de ce fichier telle
qu'on peut la voir dans l'explorateur. Dans le cas contraire, on retourne une icône à partir de l'énumération IconType.
- 125 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sous Linux, QFileIconProvider est limité aux icônes définies par IconType. Il est donc
recommandé de passer par QtIconLoader si cela ne vous suffit pas.
- 126 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• void QWidget:: setAcceptDrops(bool on) : permet au widget d'accepter tous les glisser-déposer ;
• void QDropEvent:: acceptProposedAction() : permet au widget d'accepter la proposition de glisser-déposer ;
tant qu'on n'a pas accepté la proposition, l'évenement dropEvent() ne se déclenchera pas.
private:
// Label servant à l'affichage de l'image
QLabel* m_labelImage;
public:
DragImg()
{
// Initialisation des différents contrôles
this->m_labelImage = new QLabel(this);
this->m_labelImage->setFixedSize(320,240);
// Permet au label d'accepter le glisser-déposer
this->m_labelImage->setAcceptDrops(true);
this->m_labelImage->setScaledContents(true);
}
protected :
void dragEnterEvent(QDragEnterEvent *event)
{
// On vérifie que c'est bien un fichier qui est utilisé pour le glisser-déposer
if(event->mimeData()->hasUrls())
{
QFileInfo fileInfo(event->mimeData()->urls().first().toLocalFile());
// On récupère l'extension du fichier
QString suffix = fileInfo.completeSuffix();
suffix = suffix.toLower();
// On verifie que l'extension correspond bien à un type d'image
if( suffix == "png" || suffix == "bmp" || suffix == "jpg")
{
// On accepte le glisser-déposer
event->acceptProposedAction();
}
}
}
void dropEvent(QDropEvent *event)
- 127 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
};
#include "main.moc"
- 128 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Modules > QtGui > Généralités > Interaction avec l'environnement
Comment interagir avec les applications associées par défaut ?
Auteurs : Yan Verdavaine , Denys Bulant ,
Qt fournit la classe QDesktopServices et en particulier la fonction statique QDesktopServices::openUrl, qui permet
d'interagir avec les applications associées par défaut. Elle peut être étendue si nécessaire pour ajouter ses propres
handlers pour un schéma donné.
#include <QtGui>
private :
QString m_url;
};
QVBoxLayout vl(&w);
vl.addWidget(&bouton1);
vl.addWidget(&bouton2);
vl.addWidget(&bouton3);
w.show();
return app.exec();
}
- 129 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Comme le dit la documentation, les fonctions width() et height() sont utilisables ici, car QDesktopWidget hérite de
QWidget.
Il aurait aussi été possible de passer par la fonction screenGeometry(), appartenant aussi à
QDesktopWidget, qui retourne un QRect pour récupérer la résolution d'écran, ce qui aurait
pour avantage de pouvoir retourner la résolution de chaque écran. Le fait que cette fonction
retourne un QRect permettrait, dans le cas où l'on serait passé par la méthode avec les
fonctions width() et height(), de retourner les valeurs recherchées.
- 130 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• void setIcon (const QIcon & icon) : permet d'appliquer une image qui servira d'icon dans la zone de notification
• void setContextMenu (QMenu * menu) : permet l'ajout d'un menu quand on fait un click droit sur l'icone se
trouvant dans la zone de notification.
• void showMessage (const QString & title, const QString & message, MessageIcon icon = Information, int
millisecondsTimeoutHint = 10000) : permet l'affichage d'un popup dans la zone de notification.
Exemple
#include >QApplication>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QPushButton>
#include <QHBoxLayout>
private :
QSystemTrayIcon* m_SystIcon;
QPushButton* m_Bouton_Message;
public :
SysTray()
{
// Boutou qui nous servira pour l'affichage de l'infobulle
this->m_Bouton_Message = new QPushButton("Affiche text",this);
- 131 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Exemple
// On cache la fenêtre si la personne clique sur "Hide"
connect(hide, SIGNAL(triggered()), this, SLOT(hide()));
// On affiche une infobulle dans la zone de notification
connect(m_Bouton_Message, SIGNAL(clicked(bool)), this, SLOT(Affiche(bool)));
}
private slots:
void Affiche(bool valid)
{
//Affichage de l'info bulle
m_SystIcon->showMessage
(
"Bravo !",
"Vous venez de créer une application dans la zone de notification !"
);
}
};
#include "main.moc"
Remarque : La méthode showMessage() (arrivée à partir de Qt 4.3), qui fait apparaitre une infobulle, est dépendante
des paramètres de l'OS.
- 132 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 133 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Modules > QtGui > Systèmes d'affichage > QWidgets et layouts
Comment ajouter un lien vers une page HTML ?
Auteurs : Yan Verdavaine ,
La façon la plus simple est d'utiliser un QLabel et ses possibilités de Rich text. Pour cela il suffit :
Remarque :
- 134 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
#include <QtGui>
#include <windows.h> //Sleep
// On change l'image
splash.setPixmap(QPixmap ("c:/figure2.jpg"));
// On écrit sur l'image l'étape en cours
splash.showMessage (QObject::tr ("Etape 2"), Qt::AlignRight | Qt::AlignTop, Qt::white);
// On simule un traitement de durée 2s
// /!\ pour Windows
Sleep(2000);
// On lance un traitement sur les événements
app.processEvents();
QWidget w;
w.show();
// La page se fermera une fois le widget affiché
splash.finish (&w);
Voici un exemple d'utilisation. On veut limiter l'entrée dans une zone d'édition de nombres entiers compris entre 0 et
100 et uniquement ce type de nombre.
// On définit un objet de type QIntValidator acceptant uniquement des nombre entier entre 0 et 100
QIntValidator* validator = new QIntValidator (0, 100, this);
// Création d'une zone d'édition : ici une QLineEdit
QLineEdit *edit= new QLineEdit(this);
// On applique l'objet QIntValidator à la zone d'edition
- 135 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
edit->setValidator(validator);
Le même principe est utilisable pour contrôler par exemple une valeur double avec QDoubleValidator. Si l'on
souhaite un motif spécifique par exemple une adresse IP, un numéro de téléphone ou autre, il faut utiliser la classe
QRegExpValidator ou créer soi-même un validateur à partir d'une classe dérivant de QValidator.
Pour retrouver la sélection courante qu'à faite l'utilisateur d'un programme, il suffit d'utiliser la fonction selectedText()
de la manière qui suit :
Notes : Cette fonction, retournant un QString, peut parfaitement être vide (empty, en anglais).
// void QTextCursor::removeSelectedText ()
widget->textCursor().removeSelectedText();
Note : La suppression du texte sélectionné ne se produira que s'il y a lieu d'une sélection.
L'insertion de texte avec l'assistance des curseurs s'effectue avec insertText() qui entre du texte à partir de la position
du curseur.
// void QTextCursor::insertText ( const QString & text, const QTextCharFormat & format )
widget->textCursor().insertText("Chaine de type QString");
Voici un exemple, reprenant ce qui est inscrit ci-dessus, permettant d'effectuer une modification sur un texte sélectionné
sans pour autant modifier plusieurs chaines identiques0
// ...
zoneTexte = new QTextEdit(this);
connect(zoneTexte, SIGNAL(selectionChanged()), this, SLOT(transformer()));
// ...
void XXXXXXXX::transformer()
{
// On garde en mémoire le texte sélectionné
QString selectionTexte(zoneTexte->textCursor().selectedText());
// On supprime celui-ci sans pour autant supprimer les chaines identiques
zoneTexte->textCursor().removeSelectedText();
// Et on effectue l'opération voulue au départ
zoneTexte->textCursor().insertText("<italique>" + selectionTexte + "</italique>");
- 136 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
#include <QtGui>
public:
widget()
{
QVBoxLayout * l = new QVBoxLayout(this);
m_tb = new QTextBrowser;
l->addWidget(m_tb);
connect(&m_timer,SIGNAL(timeout()),this,SLOT(AfficherPosition()));
// Affichage de la position tous les 0.5 seconde
m_timer.start(500);
}
public slots:
void AfficherPosition()
{
// Position de la souris
QPoint p = QCursor::pos();
m_tb->append(QString("curseur (%1,%2)").arg(p.x()).arg(p.y()));
}
void PositionAleatoire()
{
// Repositionnement de la souris
QCursor::setPos
(
QApplication::desktop()->width() * (qrand() / (double)RAND_MAX),
QApplication::desktop()->height() * (qrand() / (double)RAND_MAX)
);
}
};
#include "main.moc"
int main (int argc, char * argv[])
{
QApplication app(argc,argv);
qsrand (QTime::currentTime().msec());
widget w ;
w.show();
return app.exec();
- 137 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
#include <QtGui>
- 138 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
menuBar()->addAction("ajouter windows",this,SLOT(newWindows()));
//création de 4 fenêtres qui seront affichées en même temps que MainWindow
for (int i =0; i< 4;++i)
{
QMdiSubWindow * tmp = m_area->addSubWindow(new QTextEdit);
tmp->setWindowTitle(QString("fenetre %1").arg(id++));
}
}
public slots:
void newWindows()
{
// création d'une nouvelle fenêtre
QMdiSubWindow * tmp = m_area->addSubWindow(new QPushButton);
tmp->setWindowTitle(QString("fenetre %1").arg(id++));
//affichage de la fenêtre
tmp->show();
}
};
#include "main.moc"
1 Le premier est le texte qui sera affiché près de la barre pour rappeler à l'utilisateur quelle opération est en
cours ;
2 Le second est le texte du bouton Annuler ;
3 Les troisième et quatrième arguments sont les bornes minimale et maximale, respectivement, de la barre de
progression ;
4 Le cinquième est le parent de la boîte de dialogue, comme d'habitude.
Qu'est-ce donc, ces bornes ? Plongeons un peu plus dans la classe pour bien le comprendre.
Premièrement, vous pouvez utiliser le slot setValue(int) pour stocker l'avancement de la tâche (int value(void) permet
de la récupérer). Comme il s'agit d'un slot, vous pouvez l'utiliser dans le cadre du système de slots et de signaux de Qt,
mais aussi comme une fonction basique du C++.
Cette valeur doit être comprise entre les deux bornes. Elle marque l'avancement entre les deux. Par exemple, si vous avez
15 tâches à effectuer, vous mettrez le maximum à 15, et chaque tâche incrémentera la valeur de la barre de progression.
- 139 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
progress->setValue(bytesReceived);
}
void requestFinished()
{
progress->setValue(progress->maximum());
}
void requestCanceled()
{
reply->abort();
}
- 140 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Modules > QtGui > Systèmes d'affichage > Système de peinture et impression
Comment dessiner dans un QWidget ?
Auteurs : Yan Verdavaine ,
Lorsqu'un widget doit être dessiné ou redessiné, la fonction protégée QPaintEvent est appelée. Pour se dessiner, la
majorité des widgets de Qt utilise un QPainter lors de l'appel à cette fonction. Il est donc naturel de suivre cette logique.
L'évènement QPaintEvent passé en paramètre indique la zone à redessiner. Cette zone est donnée sous forme de
rectangle QPaintEvent::rect ou sous forme quelconque QRegion. Ces informations peuvent être utilisées pour optimiser
l'affichage du widget.
La classe QPainter est un outil qui permet de dessiner sur toutes les classes graphique de Qt :
QCustomRasterPaintDevice, QGLFramebufferObject, QGLPixelBuffer, QImage, QPicture, QPixmap, QPrinter,
QSvgGenerator, et QWidget.
Cette classe utilise d'autres outils de Qt. Les plus importants, à mon avis, sont :
• QPen : caractérise le contour d'une forme (ligne, point, contour d'une forme...) ;
• QBrush : caractérise l'intérieur d'une forme (intérieur d'un rectangle...).
Voici un exemple.
- 141 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
protected:
void paintEvent(QPaintEvent *event)
{
/*pre-dessin*/
if (this->viewport())
{
QPainter painter(this->viewport());
painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
painter.drawRect(QRect(0,0,50,50));
}
/*dessin originel*/
- 142 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
/*post-dessin*/
if (this->viewport())
{
QPainter painter(this->viewport());
painter.setBrush(QBrush(Qt::red, Qt::SolidPattern));
painter.drawRect(QRect(25,25,50,50));
}
event->accept();
}
};
myListView w;
w.setModel(new QStringListModel(list,&w));
w.show();
return app.exec();
}
Remarque : Comme le traitement avant-dessin se dessine en arrière plan, il peut être totalement effacé par le dessin
originel ou le post-dessin.
Sous Windows et Mac, QPrinter utilise les pilotes d'imprimante systèmes. Sous UNIX, il créé un PostScript
qu'il envoie à lp ou lpr (vous pouvez définir le programme auquel envoyer le PostScript avec la fonction
QPrinter::setPrintProgram()). QPrinter peut aussi être utilisé pour créer un fichier PDF représentant l'impression en
appelant setOutputFormat(QPrinter::pdfFormat).
- 143 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 144 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Modules > QtGui > Systèmes d'affichage > Gestion des fenêtres
Comment réaliser des fenêtres modales et amodales ?
Auteurs : François Jaffré ,
Qt permet, comme tous les framworks gérant les GUI, la création de fenêtres modales (qui bloquant l'accès aux autres
fenêtres du programme) et amodales (indépendantes des autres fenêtres du programme). La classe de base gérant les
boites de dialogues est QDialog. Celle-ci gère le mode modale ou amodale de la fenêtre à partir des méthodes suivantes :
- 145 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• bool isModal () const : permet de savoir si la boite de dialogue est modale ou pas.
• void setModal (bool modal) : permet de définir si la boite de dialogue est modale ou pas (Par défaut une boite de
dialogue Qt est amodale).
• int exec() : force l'affichage de la boite de dialogue en mode modale (la valeur définie par setModal est ignorée).
• void show() : force l'affichage de la boite de dialogue.
• void hide() : permet de cacher la boite de dialogue.
private :
QLabel * m_Label;
public :
AmodaleDial(QWidget *parent): QDialog(parent) // Contructeur de la fenêtre amodale
{
// Création du label contenu dans la fenêtre
m_Label = new QLabel("Cette fenêtre n'est pas modal", this);
m_Label->resize(100,50);
// Gestion du layout
QHBoxLayout* layout = new QHBoxLayout();
layout->addWidget(m_Label);
setLayout(layout);
}
};
private :
QLabel* m_Label;
public :
// Contructeur de notre fenêtre
ModaleDial(QWidget *parent): QDialog(parent)
{
// Création du label contenu dans la fenêtre
m_Label = new QLabel ("Cette fenêtre est modale", this);
m_Label->resize(100,50);
QHBoxLayout* layout = new QHBoxLayout();
layout->addWidget(m_Label);
setLayout(layout);
}
};
private :
QPushButton* m_Bouton_ModaleFrame;
QPushButton* m_Bouton_AmodaleFrame;
// Pointeur sur notre fenêtre, amodale
AmodaleDial* m_amodaleDial;
- 146 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
private slots:
void clickModale(bool valid)
{
// Création de notre fenêtre modale
ModaleDial modaleDial(this);
// On rend visible et modale notre fenêtre avec la méthode exec()
modaleDial.exec();
}
};
#include "main.moc"
Remarque : tous les QWidget, et, par conséquent, leurs classes dérivées, peuvent être modales, en modifiant leur
propriétés windowModality à l'aide de la méthode setWindowModality(). Cependant, il est préférable de gérer ce type
de boite de dialogue à partir d'une QDialog et nom d'un QWidget.
- 147 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Note : il est important que la taille du widget soit définie pour que le width() et le height() soient valide.
- 148 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Modules > QtGui > Systèmes d'affichage > Item View
Que dois-je savoir sur les delegates ?
Auteurs : Louis du Verdier ,
Pour pouvoir intégrer un delegate dans une vue, il faut tout d'abord sous-classer QItemDelegate (ou bien
QAbstractItemDelegate), puis redéfinir sa fonction paint(). Une fois cela fait, il ne reste plus qu'à intégrer une instance
de la classe créée dans la vue en question par le biais d'une des fonctions suivantes, fournies par QAbstractItemView,
donc disponibles pour QTreeView, QListView, etc.
QAbstractItemView est une classe très utile car elle propose des méthodes permettant d'afficher des éléments dans
des modèles. Elle permet aussi de modifier leurs propriétés par le biais du modèle conteneur, ce qui la rend plutôt
attrayante. Passer par QItemDelegate pour réaliser des delegates de simples widgets permet à ces derniers de
bénéficier de possibilités plus vastes que celles qui sont proposées par QAbstractItemView. Quant à elle, la classe
QStyledItemDelegate est recommandée lors de la création de delegates personnalisés ou bien lors de l'utilisation de
feuilles de style.
La méthode sizeHint() est une méthode très utile dans le sens où elle permet de récupérer la taille que devrait avoir le
delegate. C'est pour cela qu'il est possible de la réimplémenter.
La fonction paint() est sans doute la méthode la plus importante de celles qui sont disponibles pour les delegates. En
effet, c'est elle qui permet de leur concevoir un rendu graphique. Si vous souhaitez offrir un rendu personnalisé à votre
delegate, c'est cette méthode que vous devrez réimplémenter.
public:
inline void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex
&index) const
{
// Création d'un QStyleOptionProgressBar qui permettra de dessiner notre barre de
progression :
QStyleOptionProgressBar progressBar;
progressBar.state = QStyle::State_Enabled;
progressBar.direction = QApplication::layoutDirection();
progressBar.fontMetrics = QApplication::fontMetrics();
progressBar.rect = option.rect;
progressBar.maximum = 100;
progressBar.minimum = 0;
// Gestion de la progression :
int progress = index.data().toInt();
progress = (progress < progressBar.minimum) ? progressBar.minimum : progress;
progress = (progress > progressBar.maximum) ? progressBar.maximum : progress;
progressBar.progress = progress;
// Gestion du texte :
progressBar.text = QString::number(progressBar.progress) + "%";
progressBar.textAlignment = Qt::AlignCenter;
progressBar.textVisible = true;
- 149 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
#include "main.moc"
view->show();
return app.exec();
}
Le modèle est une interface vers les données, ce qui permet d'abstraire la façon dont celle-ci sont représentées (mémoire,
base de données, système de fichier, etc.).
La vue est la représentation visuelle des données sur l'écran. Qt fournit trois types de représentations : liste (QListView),
arbre (QTreeView) et tableaux (QTableView).
Le délégué permet de faire le lien entre la vue et le modèle. Le délégué se charge de dessiner les éléments du modèle
dans la vue, et de gérer l'édition de ces éléments.
Par rapport à Modèle-Vue-Contrôleur, le délégué est une sorte de super-contrôleur. Il génère un éditeur à la demande
de la vue, et se charge de faire parvenir les informations au modèle, c'est son rôle de contrôleur. En plus de cela, le
délégué se charge de dessiner les éléments du modèle, ce qui permet de pouvoir complètement personnaliser la vue.
- 150 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
QTreeView treeView;
treeView.setModel(&model);
QListView listView;
listView.setModel(&model);
QTableView tableView;
tableView.setModel(&model);
treeView.show();
listView.show();
tableView.show();
return app.exec();
}
Pour y remédier, il suffit de créer sa propre classe d'item qui hérite de QTreeWidgetItem et qui redéfinit cet opérateur.
Tout fonctionnera grâce au polymorphisme !
Exemple : différence entre le tri lexical de QTreeWidgetItem et le tri numérique implémenté par notre classe item
Trier un QTreeWidget
#include <QtGui>
#include <cstdlib> // srand(), rand() et RAND_MAX
#include <ctime> // time()
- 151 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Trier un QTreeWidget
{
public :
// Constructeur de MyQTreeWidgetItem
MyQTreeWidgetItem ( QTreeWidgetItem * parent, int type = Type ):QTreeWidgetItem(parent,type){};
MyQTreeWidgetItem ( QTreeWidget * parent, int type = Type ):QTreeWidgetItem(parent,type){};
// Réimplemente le test
bool operator< ( const QTreeWidgetItem & other ) const
{
// On récupère la colonne utilisée pour le test
const QTreeWidget * pTree =treeWidget ();
// Si aucun TreeWidget n'est associé, on utilise la colonne 0
int colonne = pTree ? pTree->sortColumn() : 0;
QTreeWidget tree;
// On remplit l'en-tête
QStringList entete;
entete << "int" << "double" ;
tree.setHeaderItem(new QTreeWidgetItem((QTreeWidgetItem*)0,entete));
tree.setSortingEnabled(true);
tree.resize(400, 650);
tree.expandAll();
tree.show();
- 152 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Trier un QTreeWidget
return app.exec();
}
Différence entre le tri par ordre croissant numérique implémenté par notre classe item (vue de gauche) et le tri par
ordre croissant lexical des QListWidgetItem (vue de droite).
Trier un QListWidget
#include <QtGui>
// Réimplémente le test
bool operator< ( const QListWidgetItem & other ) const
{
//On récupère les données sous forme de variant
QVariant q1= data ( 0 );
QVariant q2= other.data ( 0 );
//On verifie que les deux variants sont de même type
if (q1.type() ==q2.type())
{
// Si ce sont des int
if (q1.type()==QVariant::Int) return q1.toInt()<q2.toInt();
// Si ce sont des double
if (q1.type()==QVariant::Double) return q1.toDouble()<q2.toDouble();
}
// Sinon on appelle le comparateur de la classe mère "QListWidgetItem"
return QListWidgetItem::operator<(other);
}
};
// Viewer de gauche
QListWidget * pList1 = new QListWidget;
// On active le tri. Par défaut, tri par ordre croissant
pList1->setSortingEnabled(true);
// On utilise nos items. Tri par ordre numérique
for (int i=0;i<20;++i)
{
QListWidgetItem*item = new MyQListWidgetItem(pList1);
item ->setData ( 0, QVariant(i));
}
// Viewer de droite
- 153 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Trier un QListWidget
QListWidget * pList2 = new QListWidget;
// On active le tri. Par defaut, tri par ordre croissant
pList2->setSortingEnabled(true);
// On utilise les QListWidgetItem. Tri ordre lexical
for (int i=0;i<20;++i)
{
QListWidgetItem*item = new QListWidgetItem(pList2);
item ->setData ( 0, QVariant(i));
}
QWidget w;
QHBoxLayout hl(&w);
hl.addWidget(pList1);
hl.addWidget(pList2);
w.resize(400, 400);
w.show();
return app.exec();
}
- 154 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Modules > QtGui > Systèmes d'affichage > Graphics View
Qu'est-ce que Graphics View ?
Auteurs : Benjamin Poulain ,
Graphics View est une infrastructure qui permet de dessiner des scènes 2D complexes.
QFileDialog fileDialog;
QGraphicsProxyWidget *item = scene.addWidget(&fileDialog);
item->rotate(-15);
item->shear(-0.5, 0);
view.resize(800, 600);
view.show();
return app.exec();
}
Si le problème ne vient pas de là, vous pouvez utiliser un back-end plus performant pour dessiner. Dessiner avec les back-
end de la plateforme est assez lent, Qt contourne le problème en dessinant sur un format interne optimisé. Cela peut être
configuré en ajoutant -graphicssystem raster ou -graphicssystem opengl dans les paramètres de la ligne de commande
de l'application. Notez que l'option raster ne change rien pour Windows, car c'est déjà le back-end par défaut.
view.setViewport(new QGLWidget);
- 155 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Si cela n'est toujours pas suffisant, il vous faut optimiser précisément votre vue à l'aide des options de QGraphicsView.
Une première option à considérer est renderHints. Cette option permet de configurer les paramètres du QPainter utilisé
pour dessiner la scène. Si vous utilisez l'anti-aliasing par exemple, cela ralentit fortement le dessin des items.
view.setRenderHint(QPainter::Antialiasing, false);
view.setRenderHint(QPainter::TextAntialiasing, false);
Un autre paramètre utile est optimizationFlags. Cette propriété permet de changer les paramètres de bas niveau du
dessin de la scène. Par exemple, concevoir les items pour pouvoir utiliserQGraphicsView::DontSavePainterState est
important si les items sont très nombreux. À la différence des autres options, les paramètres de optimizationFlags
impliquent des effets de bords sur le rendu de la scène. Ne changez ce paramètre que si vos items sont conçus en
conséquence.
Finalement, il existe le paramètre cacheMode pour accélérer le rendu du fond de la vue. Le cacheMode permet de
demander à la vue de créer un cache pour l'image de fond. Cette option n'est utile que si le fond est long à dessiner, par
exemple s'il s'agit d'une image, d'un dégradé ou si la transparence est utilisée.
view.setCacheMode(QGraphicsView::CacheBackground);
- 156 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Modules > QtGui > Systèmes d'affichage > Animations
- 157 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 158 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Fichier xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<site>
<nom>developpez</nom>
<url>www.developpez.com</url>
</site>
<contributeur>
<nom faq="C++">AAA</nom>
</contributeur>
<contributeur>
<nom faq="Qt">BBB</nom>
</contributeur>
</root>
QDomDocument doc;
// Ajoute le contenu du fichier XML dans un QDomDocument et dit au QDomDocument de ne pas tenir
compte des namespaces
doc.setContent(&file, false);
// Ici, racine pointe sur une fils de <root> c'est à dire <site>
racine = racine.firstChildElement();
- 159 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
fichier xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<site>
<nom>developpez</nom>
<url>www.developpez.com</url>
</site>
<contributeur>
<nom faq="c++">AAA</nom>
</contributeur>
<contributeur>
<nom faq="Qt">BBB</nom>
</contributeur>
</root>
- 160 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 161 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 162 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Si l'on parcourt le fichier avec la méthode readNext(), les différents types de token renvoyés sont:
• StartDocument
• StartElement (name() == "developpez")
• StartElement (name() == "contributeur")
• Characters (text() == "Superjaja")
• EndElement (name() == "contributeur")
• EndElement (name() == "developpez")
• EndDocument
Pour connaître tout les types de tokens possible, se référer à la documentation de Qt.
Fichier XML
<?xml version="1.0" encoding="UTF-8"?>
<root>
<site>
<nom>developpez</nom>
<url>www.developpez.com</url>
</site>
<contributeur>
<nom faq="c++">Alp</nom>
</contributeur>
<contributeur>
<nom faq="Qt">Yan</nom>
</contributeur>
</root>
//Le but de cette boucle est de parcourir le fichier et de vérifier si l'on est au début d'un
élément.
reader.readNext();
while (!reader.atEnd())
- 163 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
if(reader.name() == "site")
{
reader.readNext();
while(reader.isStartElement()==false)
reader.readNext();
if(reader.name() == "nom")
{
QString strNom = reader.readElementText();
reader.readNext();
while(reader.isStartElement()==false)
reader.readNext();
}
if(reader.name() == "url")
{
QString strUrl = reader.readElementText();
}
}
}
if(reader.name() == "contributeur")
{
reader.readNext();
while(reader.isStartElement()==false)
reader.readNext();
if(reader.name() == "nom")
{
QString attrFAQ = reader.attributes().value("faq").toString();
QString strNameContrib = reader.readElementText();
}
}
}
reader.readNext(); // On va au prochain token
}
file.close();
Fichier XML
<?xml version="1.0" encoding="UTF-8"?>
<root>
<site>
<nom>developpez</nom>
<url>www.developpez.com</url>
- 164 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Fichier XML
</site>
<contributeur>
<nom faq="c++">AAA</nom>
</contributeur>
<contributeur>
<nom faq="Qt">BBB</nom>
</contributeur>
</root>
// Ajoute l'élément nom et lui applique le texte "developpez" et ferme l'élément nom
writer.writeTextElement("nom", "developpez");
// Ajoute l'élément url et lui applique le texte "www.developpez.com" et ferme l'élément url
writer.writeTextElement("url", "www.developpez.com");
- 165 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 166 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 167 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 168 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• int QHostInfo::lookupHost ( const QString & name, QObject * receiver, const char * member) : permet
retrouver le nom de domaine à partir d'une IP ou vice versa de manière asynchrone (non bloquante).
• QHostInfo QHostInfo::fromName (const QString & name) : permet de retrouver l'IP appartenant au domaine
et vice versa de manière synchrone (bloquante).
Exemple
#include <QApplication>
#include <Qlabel>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
public :
ResolveDNS() // Constructeur
{
// Création des differents contôles
m_Label_Domain = new QLabel("&Domain :", this);
m_Label_Ip = new QLabel("&Ip :", this);
m_Line_Domain = new QLineEdit(this);
m_Line_Ip = new QLineEdit(this);
m_Label_Domain->setBuddy(m_Line_Domain);
m_Label_Ip->setBuddy(m_Line_Ip);
m_Button_Ip = new QPushButton("Resolve IP",this);
m_Button_Domain = new QPushButton("Resolve Domain",this);
// Gestion du layout
QHBoxLayout* Layout = new QHBoxLayout();
Layout->addWidget(m_Label_Domain);
Layout->addWidget(m_Line_Domain);
Layout->addWidget(m_Label_Ip);
Layout->addWidget(m_Line_Ip);
Layout->addWidget(m_Button_Domain);
Layout->addWidget(m_Button_Ip);
setLayout(Layout);
- 169 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Exemple
}
#include "main.moc"
- 170 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
On ne crée plus un objet indépendant par requête : on instancie un manager, puis on lui demande de récupérer un
fichier, grâce à son URL. Ce fichier est demandé sous la forme d'une requête QNetworkRequest. Cette requête ne
contient pas que l'URL : elle contient aussi les en-têtes supplémentaires à envoyer au serveur, la configuration SSL...
Une fois que le fichier a été téléchargé, il est renvoyé, sous la forme d'une réponse, un QNetworkReply. Il s'agit
d'un dérivé de QIODevice, et peut donc s'utiliser de la même manière. Il peut être envoyé en tant que paramètre du
signal finished() du gestionnaire, ou bien dès la demande du fichier (mais alors, il sera probablement vide, vu que le
gestionnaire n'aura sûrement pas le temps de commencer le téléchargement).
Dès que le gestionnaire aura envoyé le signal finished(), la réponse contiendra le contenu du fichier.
En effet, le gestionnaire enverra le signal finished() avec un argument, un pointeur vers la réponse.
Pour l'envoi, elles prennent deux paramètres : une requête QNetworkRequest et des données QByteArray.
- 171 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
manager->post(request, data);
QNetworkProxy proxy;
proxy.setType(QNetworkProxy::Socks5Proxy);
proxy.setHostName("proxy.exemple.com");
proxy.setPort(1080);
proxy.setUser("username");
proxy.setPassword("password");
Maintenant, nous allons voir comment demander à un objet de passer par un proxy. Nous nous considérerons à la suite
de l'exemple de création d'un proxy.
QNetworkAccessManager manager;
manager->setProxy (proxy);
On peut aussi récupérer ce proxy par défaut grâce à la fonction statique QNetworkProxy::applicationProxy().
// QNetworkProxy::applicationProxy() == QNetworkProxy()
QNetworkProxy::setApplicationProxy (proxy);
- 172 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
// QNetworkProxy::applicationProxy() == proxy
Il est également possible de suivre l'évolution du téléchargement pour, par exemple, l'afficher dans une barre de
progression. Il est nécessaire de connecter le signal downloadProgress à un slot à redéfinir.
// Le slot de réception
Comme QNetworkReply hérite de QIODevice, il possède la fonction readAll(), qui permettra, dans l'exemple qui suit,
de récupérer ce qui est souhaité, balises HTML comprises :
La seconde solution, avec QWebFrame, est très pratique car elle permet, en plus de gérer les redirections, de récupérer
la source de la page sous deux formats avec les fonctions toHtml(), qui retourne la source avec les balises HTML, et
toPlainText(), qui retourne la source sans les balises HTML.
- 173 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
void Classe::result(bool)
{
QString html = view->page()->currentFrame()->toHtml();
QString plainText = view->page()->currentFrame()->toPlainText();
doSomething(html, plainText);
}
void Classe::result(bool)
{
QWebPage *page = view->page();
QWebFrame *frame = page->currentFrame();
QString html = frame->toHtml();
QString plainText = frame->toPlainText();
doSomething(html, plainText);
}
Vous pouvez utiliser la méthode abort() si vous désirez arrêter absolument toute activité de la réponse : cette méthode
arrête tout, téléchargement ou téléversement. Elle finit toute connexion réseau.
Il existe aussi la méthode close(), qui prépare le périphérique à la lecture : les données non lues sont perdues mais les
connexions réseaux ne s'arrêtent pas tant qu'elles ne sont pas achevées. En particulier, un téléversement en cours ne
sera pas arrêté.
reply->close();
reply->readAll(); // Cet appel ne renverra pas tout le contenu du fichier, juste ce qui aura été
téléchargé, même s'il continue à être téléchargé
reply->abort();
reply->readAll(); // Cet appel ne renverra pas tout le contenu du fichier, juste ce qui aura été
téléchargé mais le fichier ne continuera pas à être téléchargé
- 174 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Un exemple concret : l'ordinateur A (émetteur) fait trois appels successifs à la fonction write() pour envoyer des données
à l'ordi B (récepteur).
On sait que, chaque fois que B va recevoir des données, il émettra le signal readyRead() et que le slot qui y est connecté
pourra appeler une fonction, du type readAll() pour récupérer tout ce qu'on vient de recevoir.
La première idée qui vient à l'esprit c'est que, comme A a appelé trois fois la fonction write(), B émettra 3 fois
readyRead() et que les trois appels à readAll() retourneront ABCDE puis FG puis HIJ.
• En une seule fois : une seule émission du signal readyRead() et readAll() retourne ABCDEFGHIJ ;
• En 4 fois : 4 émissions de readyRead() et readAll() retourne AB puis C puis DEFGH puis IJ ;
• En 3 fois, en 10 fois, etc.
• Pour les gros paquets, les couches réseaux inférieures à TCP (Ethernet...) ne savent pas transporter des paquets
d'une taille trop grande (1500 octets, en-têtes compris par défaut pour Ethernet). Donc l'envoi d'un seul gros
paquet de données a toutes les chances d'être subdivisé en plusieurs paquets et donc d'être reçu en plusieurs fois
côté récepteur. Or, la taille maximale d'un paquet avant qu'il ne soit découpé ne peut être prévue à l'avance : ça
dépend de la configuration de l'ensemble des routeurs situés entre l'émetteur et le récepteur. De plus, pendant
une même connexion, il se peut que les paquets empruntent des chemins différents, donc passent par des
routeurs différents... donc la taille maximale peut varier dans le temps. Imprévisible, donc.
• Pour les petits paquets, à l'inverse peuvent se voir regroupés en un seul paquet : si l'émetteur veut envoyer une
dizaine de petits paquets dans un intervalle de temps très court (exemple : dix appels à write() successifs avec
2 octets écrits à chaque appel). L'interface réseau est une grande maligne qui va optimiser leur émission en
les envoyant tous d'un coup pour économiser de la bande passante. En effet, un paquet TCP est typiquement
composé d'un en-tête (origine, destination, port...) d'environ 20 octets suivi des données utiles (2 octets dans
notre exemple). Au lieu d'envoyer 10 paquets, donc 10 entêtes et 10 bouts de données, soit 10 x (20+2) = 220
octets, il va envoyer un seul paquet avec toutes les données, ce qui fera en tout un seul en-tête et 10x2 octets de
données, soit 40 octets, soit plus de 80% de bande passante économisée ! Ce mécanisme d'optimisation s'appelle
l'algorithme de Nagle et peut être désactivé pour des besoins spécifiques.
En résumé, les seules choses que TCP est capable de garantir sont que :
- 175 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
1 Quoiqu'il arrive, on recevra un jour où l'autre tous nos paquets (sauf si bien entendu entre temps un des
deux ordinateurs se déconnecte). Par contre, le temps de transmission n'est pas garanti. Cela peut prendre 1
microseconde comme une heure.
2 Quoiqu'il arrive, l'ordre de réception sera le même que celui d'émission (A, puis B, puis C, etc.).
3 Quoiqu'il arrive, les données reçues seront strictement identiques à celles émises (on ne recevra pas N à la place
de B).
En effet, même en désactivant l'algorithme de Nagle, on garantit que le nombre de paquets reçus sera au moins égal au
nombre de paquets émis, mais rien ne nous garantis que les routeurs intermédiaires ne vont pas fragmenter un paquet
en deux sous-paquets.
Donc pas de solution immédiate, il va faut se confectionner sa propre petite solution. Il y a deux solutions relativement
simples et classiques qui conviennent dans la majorité des cas.
• Pour chaque bloc de données que l'émetteur envoie, on va systématiquement le terminer avec un ou plusieurs
caractères supplémentaires qui annonceront la fin du bloc (un marqueur).
Par exemple, en admettant qu'on transmet du texte, on décide que le marqueur sera le caractère de retour à la ligne
(\n'). Côté récepteur, quand on reçoit les données, on les stocke dans un buffer jusqu'à ce qu'on trouve le marqueur
(\n'). Quand on l'a trouvé, on prend tous les caractères reçus jusque là, et on a un bloc entier de données. Les caractères
qui suivront représenteront le début du bloc suivant.
Cette méthode a l'avantage d'être très simple. Son principal inconvénient est qu'il faille trouver un marqueur qu'on
est certain de ne jamais voir apparaître dans les vraies données. En effet, l'exemple ci-dessus fonctionne parfaitement...
tant que les blocs de données eux-mêmes ne contiennent pas de retour chariot.
• La technique de pré-déclaration de la taille du paquet : lorsque l'émetteur désire envoyer un bloc de données, il
va commencer par calculer la taille totale du bloc en octets, puis va écrire cette taille sur la socket (par exemple
sous la forme de 4 octets représentant un int) avant d'écrire le bloc de données lui-même.
Côté récepteur, on saura qu'au début de chaque nouveau bloc, on recevra d'abord sa taille sur 4 octets. Une fois la taille
reçue et décodée, on prépare un buffer de la bonne taille pour les données à recevoir. Tant que le buffer n'est pas rempli,
on ajoute tout ce qu'on reçoit dedans. Dès que le buffer est rempli, on sait qu'on a reçu un nouveau bloc de données.
On peut alors le traiter et recommencer à chercher à décoder la taille du bloc suivant.
lien : Pourquoi les nombres de paquets émis et reçus avec QTcpSocket diffèrent-il ?
- 176 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 177 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• int post ( const QString & path, QIODevice * data, QIODevice * to = 0) : permet l'envoi de données ;
• int get ( const QString & path, QIODevice * to = 0) : permet la réception des données ;
• int close () : ferme la connexion.
private slots:
- 178 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
};
#include "main.moc"
- 179 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Remarque 1 : cette classe possède de nombreux signaux qui permettrent de suivre l'état de la connexion avec le serveur.
Référez-vous à la doc pour plus d'information.
Remarque 2: depuis Qt 4.4, QHttp est déprécié au profit des classes QNetworkAccessManager et QNetworkReply, qui
offrent plus de souplesse que QHttp.
Comment exécuter une requête simple sur un serveur avec la méthode GET ?
Auteurs : LittleWhite ,
Pour exécuter une requête, nous avons besoin de deux choses : QHttp et QUrl.
QHttp permet de faire la requête proprement dite, alors que QUrl simplifie l'interaction avec les données pour se
connecter au serveur (son adresse, son port ainsi la sécurisation (HTTPS) ou non de la connexion).
Il faut aussi connecter le slot requestFinished(int, bool) afin de récupérer les données renvoyées par le serveur.
Pour simplifier le travail nous pouvons hériter de la classe QHttp afin de créer notre classe Client. Celle ci contiendra
une fonction connexion afin de faire la requête.
#include <QHttp>
#include <QUrl>
private:
QUrl url;
int idRequete;
public slots:
// Nous vérifions si la requête est celle que nous voulons (dans le cas où plusieurs requête
sont en cours)
if ( id == idRequete )
// Ici on peut mettre un code pour récupérer les données renvoyées par le serveur dans
un QByteArray
this->readAll();
}
public:
- 180 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
void connexion(void)
{
this->setHost ( url.host(),
// on détermine si c'est une connection sécurisée
( url.scheme().toLower() == "https" ) ? QHttp::ConnectionModeHttps :
QHttp::ConnectionModeHttp,
url.port() == -1 ? 0 : url.port() // On determine le port
);
Comment exécuter une requête avec envoie d'information sur un serveur avec la méthode GET ?
Auteurs : LittleWhite ,
Pour exécuter une requête plus évoluée, nous avons besoin de trois choses : QHttp, QUrl et QHttpRequestHeader
QHttp exécute la requête proprement dite, alors que QUrl simplifie l'interaction avec les données de connexion au
serveur à contacter (son adresse, son port ainsi la sécurisation (HTTPS) ou non de la connexion). QHttpRequestHeader
ajoute des informations sur notre connexion. Grâce à cette classe, nous pouvons passer des cookies ou encore changer
le user-agent (qui permet d'identifier le navigateur).
Il faut aussi connecter le slot requestFinished(int, bool) afin de récupérer les données renvoyées par le serveur.
Pour simplifier le travail nous pouvons hériter de la classe QHttp afin de créer notre classe Client. Celle ci contiendra
une fonction connexion afin de faire la requête.
#include <QHttp>
#include <QUrl>
private:
QUrl url;
int idRequete;
public slots:
// Nous vérifions si la requête est celle que nous voulons (dans le cas où plusieurs requête
sont en cours)
if ( id == idRequete )
// Ici on peut mettre un code pour récupérer les données renvoyées par le serveur dans
un QByteArray
this->readAll();
}
- 181 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
public:
void connexion(void)
{
this->setHost ( url.host(),
// on détermine si c'est une connexion sécurisée
( url.scheme().toLower() == "https" ) ? QHttp::ConnectionModeHttps :
QHttp::ConnectionModeHttp,
url.port() == -1 ? 0 : url.port() // On détermine le port
);
idRequete = this->request(reqHeader);
}
};
Si vous utilisez Firefox, et que vous ne savez pas quoi mettre dans l'en-tête, vous pouvez
utiliser LiveHTTPHeaders qui affichera les information des en-têtes envoyés et reçus par le
navigateur.
lien : LiveHttpHeaders
Comment exécuter une requête avec envoi d'informations sur un serveur avec la méthode POST ?
Auteurs : LittleWhite ,
Une requête POST permet, par exemple, de se connecter à un Site Web en envoyant un identifiant et un mot de passe.
Pour exécuter une requête POST, nous avons besoin de trois choses : QHttp, QUrl et QHttpRequestHeader
QHttp exécute la requête proprement dite, alors que QUrl simplifie l'interaction avec les données de connexion au
serveur à contacter (son adresse, son port ainsi la sécurisation (HTTPS) ou non de la connexion). QHttpRequestHeader
ajoute des informations sur notre connexion. Grâce à cette classe, nous pouvons passer des cookies ou encore changer
le user-agent (qui permet d'identifier le navigateur).
Il faut aussi connecter le slot requestFinished(int, bool) afin de récupérer les données renvoyées par le serveur.
Pour simplifier le travail nous pouvons hériter de la classe QHttp afin de créer notre classe Client. Celle ci contiendra
une fonction connexion afin de faire la requête.
#include <QHttp>
#include <QUrl>
- 182 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
private:
QUrl url;
int idRequete;
public slots:
// Nous vérifions si la requête est celle que nous voulons (dans le cas où plusieurs requête
sont en cours)
if ( id == idRequete )
// Ici on peut mettre un code pour récupérer les données renvoyées par le serveur dans
un QByteArray
this->readAll();
}
public:
void connexion(void)
{
this->setHost ( url.host(),
// on détermine si c'est une connexion sécurisée
( url.scheme().toLower() == "https" ) ? QHttp::ConnectionModeHttps :
QHttp::ConnectionModeHttp,
url.port() == -1 ? 0 : url.port() // On détermine le port
);
- 183 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Si vous utilisez Firefox, et que vous ne savez pas quoi mettre dans l'en-tête, vous pouvez
utiliser LiveHTTPHeaders qui affichera les information des en-têtes envoyés et reçus par le
navigateur.
lien : LiveHttpHeaders
QHttp exécute la requête proprement dite, alors que QUrl simplifie l'interaction avec les données de connexion au
serveur à contacter (son adresse, son port ainsi la sécurisation (HTTPS) ou non de la connexion). QHttpRequestHeader
ajoute des informations sur notre connexion. Grâce à cette classe, nous pouvons passer des cookies ou encore changer le
user-agent (qui permet d'identifier le navigateur). QHttpResponseHeader doit être analysé afin de récupérer le cookie.
Il faut connecter le slot requestFinished(int, bool) afin de récupérer les données renvoyées par le serveur, et le slot
responseHeaderReceived(const QHttpResponseHeader&) pour récupérer l'en-tête de réponse du serveur.
Pour simplifier le travail nous pouvons hériter de la classe QHttp afin de créer notre classe Client. Celle ci contiendra
une fonction connexion afin de faire la requête.
#include <QHttp>
#include <QUrl>
private:
QUrl url;
int idRequete;
public slots:
// Nous vérifions si la requête est celle que nous voulons (dans le cas où plusieurs requête
sont en cours)
if ( id == idRequete )
// Ici on peut mettre un code pour récupérer les données renvoyées par le serveur dans
un QByteArray
this->readAll();
}
- 184 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
}
else
{
// Il est possible que les identifiants ne soient pas bons...
}
}
public:
void connexion(void)
{
this->setHost ( url.host(),
// on détermine si c'est une connection sécurisée
( url.scheme().toLower() == "https" ) ? QHttp::ConnectionModeHttps :
QHttp::ConnectionModeHttp,
url.port() == -1 ? 0 : url.port() // On determine le port
);
Si vous utilisez Firefox, et que vous ne savez pas quoi mettre dans l'en-tête, vous pouvez
utiliser LiveHTTPHeaders qui affichera les information des en-têtes envoyés et reçus par le
navigateur.
lien : LiveHttpHeaders
- 185 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 186 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
La particularité de Phonon réside dans le fait qu'il permet de s'abstraire des couches bas-niveau pour accéder aux
fonctions multmédia d'un système d'exploitation.
Ainsi, une application utilisant Phonon intégrera DirectX ou Xine/GStreamer ou QuickTime de façon transparente
pour le développeur. Chacun de ces accès étant géré par un plug-in nommé back-end. C'est ce dernier qui se chargera
d'intégrer la couche bas niveau dans l'application
Où récupérer Phonon ?
Auteurs : LeGars ,
Pour Windows et Mac OS, Phonon est directement inclus dans le framework Qt. Sous Linux, c'est généralement un
paquet à part.
Avec MinGW.
- 187 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Par exemple, pour ajouter la classe MediaSource, il faut ajouter cette ligne.
#include <Phonon/MediaSource>
QT += phonon
• Phonon::AudioOutput : permet d'envoyer des données audio à la carte son ou dans un casque audio ;
• Phonon::Effect : utilisé pour transformer un flux audio ;
• Phonon::EffectWidget : un widget permettant de contrôler les paramètres d'un effet ;
• Phonon::MediaNode : la classe de base pour tous les noeuds de type média ;
• Phonon::MediaObject : un noeud média qui contrôle la lecture d'un objet multimédia ;
• Phonon::MediaSource : un objet qui fournit les données médias à un noeud de données sources ;
• Phonon::Path : Un chemin de données d'un noeud de données sources à un noeud contrôleur d'objet média ;
• Phonon::SeekSlider : un widget permettant d'afficher et de modifier la position de lecture d'un objet média
dans le temps ;
• Phonon::VideoPlayer : un widget qui peut charger et jouer une vidéo, et qui gére automatiquement la création
du noeud média et des chemins en arrière plan ;
• Phonon::VideoWidget : un widget pour jouer une vidéo ;
• Phonon::VolumeSlider : un widget pour afficher et modifier le volume d'un objet média.
Les données sources sont représentées par des objets Phonon::MediaSource auxquels on fournit un fichier, une URL
ou un QIODevice à partir duquel les données sont récupérées.
Les noeuds médias sont de trois types : les noeuds sources, (à ne pas confondre avec les données sources), les noeuds
processeurs et les noeuds contrôleurs. Les noeuds sources sont représentés par la classe Phonon::MediaObject et
fournissent l'interface de lecture du média.
Un objet Phonon::MediaObject posséde l'objet courant Phonon::MediaSource et peut également avoir une liste de
d'autres objets sources prêts à être lus les uns après les autres.
La sortie d'un objet Phonon::MediaObject doit aller sur un contrôleur par un ou plusieurs chemins. Un chemin
est représenté par un objet Phonon::Path et doit avoir un noeud source (Phonon::MediaObject) ainsi qu'un noeud
contrôleur tel que Phonon::AudioOutput ou Phonon::VideoWidget. Le chemin peut être direct ou peut contenir des
noeurs processeurs intermédiaires afin de fournir des effets spéciaux.
Le module Phonon ne supporte pas la manipulation directe de données dans un flux média. Il fournit
cependant une manipulation indirecte des flux audio à travers les processeurs d'effets. Ces processeurs
(Phonon::Effect) peuvent être ajoutés, à un chemin entre la source et le contrôleur où ils transforment les
données de l'un à l'autre. Les effets disponibles dépendent du back-end de Phonon et sont fournis par la
fonction Phonon::BackendCapabilities::availableAudioEffects(). Les effets peuvent inclure l'amplification du son, le
positionnement du flux dans un environemment stéréo, l'égalisation ou le rééchantillonnage.
- 188 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Pour en appliquer un, nous créons une nouvelle instance de Phonon::Effect pour l'effet que nous voulons. Il faut
ensuite garder le pointeur vers l'objet Phonon::Path retourné par la fonction Phonon::createPath(), puis appeler
Phonon::Path::insertEffect() en passant l'effet que l'on vient de créer.
Le noeud contrôleur est l'endroit où les données sont finalement envoyées aux périphériques tels que la carte son,
un casque audio ou un widget vidéo représentés par le noeud média Phonon::AudioOutput ou par les widgets
Phonon::VideoPlayer et Phonon::VideoWidget qui servent également de noeuds médias.
Les relations entre les objets sont illustrées dans le schèma suivant :
- 189 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Il existe aussi des back-end pour Mac (QuickTime) et Linux (Xine et GStreamer). Le développeur ne se concentre que
sur la communication entre son application et Phonon, permettant ainsi d'offrir une application réellement multi-
plateforme.
- 190 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 191 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 192 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 193 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 194 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 195 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 196 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 197 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 198 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 199 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 200 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 201 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 202 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Il est construit sur la base de plug-ins permettant d'ajouter des fonctionnalités facilement, étant donné qu'il est open
source.
Comment utiliser QtCreator avec les outils de Visual Studio (compilateur et débogueur) ?
Auteurs : Thibaut Cuvelier ,
Il vous suffit d'avoir à disposition quelques outils, et de configurer légèrement Qt Creator.
- 203 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Qt Creator : BinEditor, Bookmarks, Core, Debugger, Find, Help, Locator, ProjectExplorer, ResourceEditor, TextEditor,
Welcome.
Édition des fichiers avec des interfaces spécifiques.
Une session est créée par défaut et vous permettra en l'ouvrant de récupérer les projets de votre dernière instance. Il
est également possible de créer ses propres sessions grâce au session manager permettant de gérer différents espaces
de travail.
Pour terminer, les sessions sont à voir comme une sauvegarde d'un environnement de travail incluant plusieurs projets :
aucune option de configuration n'est liée à celle-ci.
- 204 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 205 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 206 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
• Installez NetBeans.
• Installez MinGW, MSYS et la dernière version de Qt (compilée pour MinGW) ; ou bien le Qt SDK.
• Ajoutez le répertoire de qmake (Qt/bin) à votre PATH.
• Dans NetBeans, ajoutez les différents chemins qui correspondent à votre compilateur (Tools > Options > C/C+
+).
- 207 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 208 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Pour cela, il suffit d'ajouter cette ligne dans votre fichier de projet .pro :
CONFIG += console
Il peut aussi être intéressant de n'activer la console que pour la version debug. Il faut alors ajouter cette ligne à votre
fichier de projet .pro :
debug:CONFIG += console
MOC_DIR : Fichiers générés par l'outil moc (un fichier par classe héritant de QObject)
MOC_DIR = ../tmp
RCC_DIR : Fichiers générés par l'outil rcc (sources C++ contenant les données des ressources Qt)
RCC_DIR = ../resources
UI_DIR : Fichiers générés par l'outil uic (en-têtes C++ correspondant aux fichiers d'interface)
UI_DIR = ../ui
- 209 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 210 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 211 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 212 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 213 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Il existe deux API de niveau différent pour la création de plug-ins. Une API de haut niveau, pour les plug-ins pour Qt,
et une API de bas niveau pour les applications.
Toute une série de types de plug-ins est réservée à Qt Embedded Linux, parce que Qt peut alors fonctionner sur une
panoplie de matériel différent, qui ne s'utilise pas de la même manière.
Tous les plug-ins sont rangés dans un répertoire, subdivisé en autant de répertoires qu'il y a de type de plug-ins.
Les plug-ins ne sont pas chargés automatiquement : si Qt a besoin d'un plug-in pour lire un format d'image qui n'est pas
supporté nativement, il va demander aux plug-ins les formats qu'ils peuvent lire. Si l'un d'entre eux semble convenir, il
est chargé complètement. Si vous ne lisez pas la moindre image dans votre application, aucun plug-in de lecture d'images
ne sera chargé.
Pourquoi ? Tous les environnements influencent fortement la manière de produire des binaires. Deux configurations
de Qt différentes ne sont pas forcément compatibles ! Pour éviter tous les désagréments qui peuvent être causés par ces
différences (cela peut aller de aucun problème à un plantage lamentable du système), Qt vérifie que tous les binaires
sont parfaitement compatibles.
- 214 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Lorsque vous lancez votre application Qt, ce dernier commence par s'initialiser. Il vérifie que la buildkey de votre
application correspond à la buildkey de Qt. Ensuite, lors du chargement de chaque module, cette vérification est aussi
effectuée. De même lors du chargement de chaque plug-in.
Qt tient un cache avec toutes ces informations. Ce cache est réactualisé à chaque changement d'un des fichiers. Ceci
permet d'éviter de recharger l'entièreté des fichiers à chaque fois, et d'ainsi gagner du temps. Ce cache est géré par
QSettings, son emplacement change donc en fonction de l'OS.
Par exemple, sous Windows, il se situe dans le registre à cet emplacement : HKEY_CURRENT_USER\Software
\Trolltech\OrganizationDefaults\.
Pour être beaucoup plus précis, Qt pourra charger des plug-ins pour d'autres versions, mais à quelques conditions :
que le plug-in ait été compilé avec une version antérieure de Qt, mais de la même branche. S'il a été compilé avec Qt
3, il ne fonctionnera pas avec une application Qt 4. S'il a été compilé avec Qt 4.5.1, et que l'application l'a été avec Qt
4.5.0, ça ne fonctionnera pas. Par contre, s'il a été compilé avec la version 4.5.0, et que l'application a été compilée avec
Qt 4.5.1, ça fonctionnera. Sauf si une buildkey additionnelle a été précisée lors de la compilation de Qt : il faudra que le
plug-in soit compilé avec une version compatibles (donc antérieure) et ait la même buildkey additionnelle.
Après avoir créé un objet de ce type, il faut spécifier le nom de la bibliothèque dynamique à associer sans préciser
l'extension (ce n'est plus multi-plateformes, sinon). Il suffit ensuite d'appeler resolve() en fournissant le nom du symbole
à trouver. Il est retourné en tant que void*, donc un cast sera bien évidemment nécessaire. Sont aussi fournies des
fonctions statiques évitant l'instanciation dans le cas où l'on ne voudrait récupérer qu'un symbole.
Par exemple, admettons qu'une fonction d'une bibliothèque permette de compter le nombre de lettres dans un mot.
- 215 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 216 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 217 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Intégration avec d'autres bibliothèques > Généralistes > boost.signals
Comment allier les signaux de Boost (boost.signals) aux signaux/slots de Qt ?
Auteurs : Denys Bulant ,
Il est intéressant de savoir faire ceci dans la mesure où vous désirez 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.
Le code total et compilable sera présenté ; uniquement les snipets intéressants seront mis en avant lors de chaque
réponse.
Bien que plus verbeuse, la seconde méthode permet de découpler réellement la couche utilisant Qt de la couche sans
Qt en "intercalant" une couche servant d'aptateur.
public:
QtClass()
{
connect(this, SIGNAL(qtSignal(float)), this, SLOT(qtSlot(float)));
- 218 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
signals:
void qtSignal(float);
};
class NonQtClass
{
public:
void boostSignalToQtSignal(QtClass *qc)
{
boost::signal<void (float)> sig;
sig.connect(boost::bind(&QtClass::triggerQtSignalEmission, qc, _1));
sig(42.0f);
}
};
Sortie obtenue
D'une connexion interne :
Dans QtClass::qtSlot(), x=42
class NonQtClass
{
public:
void boostSignalToQtSlot(QtClass *qc)
{
boost::signal<void (float)> sig;
sig.connect(boost::bind(&QtClass::qtSlot, qc, _1));
sig(3.14f);
}
};
- 219 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sortie obtenue
Envoyeur inconnu :
Dans QtClass::qtSlot(), x=3.14
Nous allons donc mettre en place ici une méthode impliquant la création d'une classe servant d'adaptateur entre les
deux paradigmes (signaux Qt / boost.signals).
public:
// OBLIGATOIRE si on veut connecter un signal boost à un signal Qt: les signaux sont
**protégés**
void triggerQtSignalEmission(float x)
{
emit qtSignal(x);
}
signals:
void qtSignal(float);
};
public:
QtSignalToStandardCPPBridge(QtClass *qc)
{
connect(qc, SIGNAL(qtSignal(float)), this, SLOT(onQtSignalEmitted(float)));
}
template<typename Signature>
void addStandardSlot(Signature fun)
{
sig.connect(fun);
}
private slots:
void onQtSignalEmitted(float x)
{
sig(x);
}
private:
boost::signal<void (float)>sig;
};
- 220 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
class NonQtClass
{
public:
// fonction normale que l'on appelera depuis un signal Qt en passant par un pont
void normalFunction(float x)
{
std::cout << "Dans NonQtClass::normalFunction(), x=" << x << std::endl;
}
public:
void QtSignalToStandardFunction(QtClass *qc)
{
QtSignalToStandardCPPBridge adapter(qc);
adapter.addStandardSlot(boost::bind(&NonQtClass::normalFunction, this, _1));
adapter.addStandardSlot(boost::bind(&NonQtClass::displaySquareRoot, this, _1));
// On déclenche ici manuellement l'émission du signal Qt
qc->triggerQtSignalEmission(121.0f);
}
};
Sortie obtenue
Dans NonQtClass::normalFunction(), x=121
Dans NonQtClass::displaySquareRoot(), sqrt(x)=11
- 221 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 222 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Intégration avec d'autres bibliothèques > 2D/3D > SDL
- 223 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Intégration avec d'autres bibliothèques > 2D/3D > SFML
- 224 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Sommaire > Intégration avec d'autres bibliothèques > 2D/3D > Ogre3D
- 225 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 226 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
lien : Qwt
lien : Qwt
1 Compiler Qwt et son plugin en mode release (ou vérifier qu'ils le sont bien) ;
2 Copier qwt.dll dans C:\Qt\version\bin ;
3 Copier qwt_designer_plugin5.dll dans C:\Qt\version\bin\designer.
- 227 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
#include <QApplication>
#include <qwt_plot.h>
#include <QApplication>
#include <qwt_plot.h>
- 228 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
point aura comme coordonnées [ xData[0],yData[0] ]. Le troisième paramètre, size, renseigne sur le nombre de points
à afficher, en partant de zéro. Bien sûr, xData et yData doivent au moins contenir size éléments.
#include <QApplication>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
// Il faut rafraîchir l'affichage grâce à la méthode replot(), quand les données ont changé.
myPlot.replot();
myPlot.show();
return app.exec();
}
Vous remarquerez que les axes se sont automatiquement ajustés aux données.
#include <QApplication>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
- 229 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
// courbe en rouge
myCurve.setPen(QPen(Qt::red));
// Il faut rafraîchir l'affichage grâce à la méthode replot(), quand les données ont changé.
myPlot.replot();
myPlot.show();
return app.exec();
}
#include <QApplication>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_grid.h>
myCurve.setData(x.data(),y.data(),x.size());
// Il faut rafraîchir l'affichage grâce à la méthode replot(), quand les données ont changé.
myPlot.replot();
myPlot.show();
return app.exec();
}
#include <Application>
#include <QHBoxLayout>
#include <qwt_plot.h>
- 230 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
#include <qwt_plot_curve.h>
#include <qwt_plot_grid.h>
QwtPlot myLeftPlot;
QwtPlotGrid myLeftGrid;
myLeftGrid.enableX(false); // On affiche seulement les lignes horizontales
myLeftGrid.attach(&myLeftPlot);
QwtPlot myRightPlot;
QwtPlotGrid myRightGrid;
myRightGrid.enableY(false); // On affiche seulement les lignes verticales
myRightGrid.attach(&myRightPlot);
QHBoxLayout myLayout(&myWidget);
myWidget.setLayout(&myLayout);
myLayout.addWidget(&myLeftPlot);
myLayout.addWidget(&myRightPlot);
myLeftPlot.replot();
myRightPlot.replot();
myWidget.show();
return app.exec();
}
#include <QApplication>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_grid.h>
QwtPlot myPlot;
QwtPlotGrid myGrid;
myGrid.attach(&myPlot);
myPlot.setAxisTitle(QwtPlot::xBottom,QString("My x values"));
// On peut bien sûr utiliser les mêmes propriétés que QString
myPlot.setAxisTitle(QwtPlot::yLeft,QString("<u>My y values</u>"));
myPlot.replot();
myPlot.show();
return app.exec();
- 231 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
#include <QApplication>
#include <qwt_plot.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_grid.h>
#include <qwt_plot_zoomer.h>
int main(int argc, char** argv)
{
QApplication app(argc,argv);
QwtPlot myPlot;
QwtPlotGrid myGrid;
myGrid.attach(&myPlot);
QwtPlotZoomer myZoomer(myPlot.canvas());
myPlot.replot();
myPlot.show();
return app.exec();
}
DEFINES += QWT_DLL
Ce problème n'apparaît que sous Windows, cette solution ne s'applique donc qu'à ce système !
- 232 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Toutes les fonctionnalités cryptographiques sont fournies par des plug-ins (dans le dossier plugins/crypto), chargés
dynamiquement, à l'exécution, en fonction des besoins.
Cette librairie est orientée vers la sécurité : outre les hash (MD4, MD5, SHA-1, SHA-512, Blowfish...), elle propose une
implémentation des algorithmes les plus répandus et éprouvés (TLS, OpenGPG, RSA...), des emplacements mémoires
sécurisés (qui ne seront jamais écrits sur le disque dur), des nombres pseudo-aléatoires...
QCA se base sur un système de plug-ins : lui-même ne fournit strictement rien, tout est implémenté dans les plug-ins.
Ces plug-ins se servent d'autres bibliothèques renommées et optimisées : OpenSSL, Cyrus SASL, GNU PG...
Vous devez commencer par récupérer les sources sur le site officiel. Elles sont compressées avec BZip2 et rassemblées
avec TAR : vous pouvez utiliser ces binaires en ligne de commande, ou utiliser un archiveur comme 7Zip ou WinRar.
configure
nmake
installwin
configure
make
installwin
./configure
make
make install
/sbin/ldconfig
Ensuite, configurez votre IDE avec les répertoires de QCA (répertoires include/, lib/ et bin/).
Ici, vous n'aurez que QCA, sans le moindre plug-in, c'est-à-dire une carcasse sans chair.
- 233 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Vous devrez télécharger les sources de chaque plug-in ainsi que les dépendances. Les fichiers de projet sont livrés.
Utilisez simplement ces commandes (pour Visual Studio).
qmake
nmake
qmake
make
Vous devez toujours passer par qmake, comme d'habitude avec Qt. Cependant, vous devrez utiliser une nouvelle ligne
dans votre fichier de projet. La voici.
CONFIG *= crypto
Si vous voulez générer un nouveau projet, et que cette ligne soit déjà incluse, vous pouvez utiliser cette commande.
Ici, l'opérande *= permet de n'inclure la librairie que si elle ne l'est pas encore, contrairement
à +=, qui ajoute inconditionnellement.
Les nombres sont générés à partir d'un plug-in. Ceci signifie que le plug-in définit les bornes des nombres générés,
vous ne pouvez pas le spécifier, contrairement à Boost.Random (dans Boost, vous choisissez la fonction ; dans QCA,
un plug-in est choisi).
// Un entier pseudo-aléatoire
int randInt = QCA::Random::randomInt();
- 234 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
// 10 octets aléatoires
// Un octet est un nombre compris entre (2^0)-1 et (2^8)-1
// c'est-à-dire entre 0 et 255
QCA::SecureArray array = QCA::Random::randomArray(10);
Le problème, c'est que, si l'on prend beaucoup de nombres générés, et que l'on divise la borne en quatre, chaque quart
aura le même nombre de nombres générés : ils seront également répartis entre ces quatre quarts.
Un hash est une empreinte qui permet d'identifier, avec un certain degré d'erreur, des données. Plusieurs données
peuvent avoir le même hash : cela s'appelle une collision. Ce sont ces collisions qui mettent à mal certains anciens
algorithmes (MD4, MD5, SHA-0, bientôt SHA-1) : en effet, cela permet d'envoyer un fichier corrompu et vérolé
sans que le destinataire ne puisse le remarquer.
• SHA-0,
• SHA-1,
• MD2,
• MD4,
• MD5,
• RIPEMD160,
• SHA-224,
• SHA-256,
• SHA-384,
• SHA-512,
• Whirlpool.
Pour pouvoir hasher des données, il faut commencer par initialiser un QCA::Hash avec un des algorithmes ci-dessus
(écrivez le nom de l'algorithme en minuscules, en gardant tiret et chiffres). Ensuite, vous utilisez la fonction update()
pour y insérer des données. final() permet de récupérer le hash résultant.
Cependant, avant de pouvoir utiliser un algorithme de hash, vous devez être sûr qu'il soit disponible. En effet, tous les
algorithmes de hash sont implémentés dans des plug-ins. Pour ce faire, utilisez la fonction QCA::isSupported().
- 235 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
#include <QtCrypto>
int main(){
Elle est semblable à QByteArray pour les fonctionnalités proposées : append(), at(), clear(), constData(), data(), resize()
et size() sont autant de fonctions qui existent des deux côtés. Un SecureArray peut être facilement transformé en
QByteArray grâce à la fonction toByteArray().
#include <QtCrypto>
int main(){
- 236 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
- 237 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
QXmpp est une bibliothèque très simple d'utilisation basée sur Qt (multi-plateforme) qui permet de créer des clients
basés sur le protocole XMPP. Elle vous permettra à peu près toutes les actions supportées par le protocole.
QXmppLogger::getLogger()->setLoggingType(QXmppLogger::StdoutLogging);
C'est la seule ligne nécessaire. Il vous faudra la placer avant de connecter le client.
Plusieurs choses à savoir sur les possibilités offertes par QXmpp. Il vous est possible de capturer les logs de trois manières
différentes :
De plus, si vous souhaitez utiliser la dernière possibilité, la classe QXmppLogger fournit le signal suivant :
L'enumération MessageType :
enum MessageType
{
DebugMessage = 0, // Message de type "déboguage"
InformationMessage, // Message de type "information"
WarningMessage, // Message de type "avertissement"
ReceivedMessage, // Message reçu du serveur
SentMessage, // Message envoyé au serveur
- 238 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
};
#include "QXmppClient.h"
return a.exec();
}
Cette forme est la plus simple. Il existe au total deux autres surcharges de cette fonction mais celle-ci est celle que vous
utiliserez le plus. Passons en revue les différents paramètres :
Le port par défaut qui est utilisé est le port 5222, si vous souhaitez le changer, il vous suffit de rajouter un cinquième
paramètre. Enfin, il est possible d'en rajouter un sixième qui correspond au statut initial, il vous faudra pour cela créer
un objet de type QXmppPresence.
- 239 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Le récupérer vous est donc obligatoire si vous souhaitez réaliser un client de messagerie digne de ce nom. C'est à partir
du roster que vous recevrez toutes les informations nécessaire au dialogue.
La première étape de la récupération du roster est la requête au serveur qui ressemble à ceci :
• "qxmpp1" correspond à un id unique pouvant être attribué de manière arbitraire. Vous pouvez tout à fait
mettre 1, 2, 3... ou tartenpion1, tartenpion2 etc. du moment que l'id reste unique pour chaque requête ;
• l'adresse dans l'attribut "from" correspond ni plus ni moins à l'adresse du client suivis de sa ressource
(attribuée par le serveur) ;
• <query xmlns="jabber:iq:roster"/> correspond à la requête en elle même de récupération du roster.
Toute les information sur le roster courant sont contenues dans le rosterManager de l'object client et vous n'avez donc
rien de particulier à faire pour le récupérer si ce n'est d'appeler cet objet rosterManager.
Il faut savoir que comme tout protocole utilisant le réseau, il y à un temps avant la récupération des données et vous ne
pourrez donc pas traiter le roster tant que celui n'est pas entièrement reçu. Vous devrez donc utiliser le signal suivant :
void rosterReceived()
de cette manière :
Le slot rosterReceived étant un slot personnalisé dans lequel nous allons récupérer les informations du roster. Pour
récupérer tous les JIDs contenus dans le roster et les afficher nous précéderons comme ceci :
- 240 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/
La FAQ pour la programmation C++ avec Qt
Vous ne récupérerez grâce à ce code que les JIDs (donc dans la majorité des cas l'adresse mail de l'"ami"), dépourvus
de toute ressource, dans une liste de QString que vous pouvez traitez ensuite comme bon vous semble.
- 241 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - 2010 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://qt.developpez.com/faqtmp/