Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo

precedent    sommaire    suivant   


Comment changer de style de fenêtre ?
auteur : Matthieu Brucher
Il suffit d'ajouter cette ligne :

    QApplication::setStyle(new QPlastiqueStyle);
si QPlastiqueStyle est le style que vous désirez afficher.

lien : en Un exemple de création et d'utilisation de style sur le site de Trollech

Comment dessiner dans un QWidget ?
auteur : Yan Verdavaine
Lorsqu'un widget doit être dessiné ou redessiné, la fonction protégée void paintEvent ( QPaintEvent * event ) est appelée. Pour se dessiner, la majorité des widgets de Qt utilise un QPainter lors de l'appel de 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 Qrect & QPaintEvent::rect () ou sous forme quelconque QRegion& QPaintEvent::region (). Ces informations peuvent être utilisées pour optimiser l'affichage du widget.

La class 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 important à 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 :


#include <QtGui>

class MyTest : public QWidget
{
public:
	MyTest ( QWidget * parent = 0, Qt::WindowFlags f = 0 ) : QWidget  (parent,f){};
	void paintEvent ( QPaintEvent * event )
		{
		//creation d'un QPainter
		//QPen : aucun contour
		//QBrush : aucun remplissage
		QPainter painter(this);

		//On definie au QPainter un stylo rouge de taille 4
		QPen pen;
		pen.setColor (Qt::red);
		pen.setWidth (4);
		painter.setPen(pen);

		//On dessine un rectangle
		//QPen : rouge de taille 4
		//QBrush : aucun remplissage
		painter.drawRect (10, 10, 80, 80);

		//on definie au QPainter un pinceau vert utilisant le pattern SOLID
		QBrush brush(Qt::SolidPattern);
		brush.setColor(Qt::green);
		painter.setBrush(brush);

		//on dessine un rectangle
		//QPen : rouge de taille 4
		//QBrush : remplissage vert avec le pattern SOLID
		painter.drawRect (15, 15, 70, 70);


		//on definie au QPainter stylo bleu  de taille 8
		pen.setColor (Qt::blue);
		pen.setWidth (8);
		painter.setPen(pen);

		//dessine une ligne
		//QPen : bleu de taille 8
		//QBrush : n'est pas utilise pour une ligne
		painter.drawLine(0, 0, 100, 100);
		}
};

int main(int argc, char* argv[])
{
	QApplication app(argc, argv);
	MyTest win;
	win.resize(100, 100);
	win.show();
	return app.exec();
}
                
			

Comment trier un QTreeWidget ?
auteur : Yan Verdavaine
Les QTreeWidget trient leurs items grâce à l'operateur < des QTreeWidgetItem. Par défaut, cet opérateur compare deux QString. Malheureusement, ceci ne correspond pas toujours à ce que l'on souhaite.

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


#include <QtGui>
#include <cstdlib>  //srand, rand et RAND_MAX
#include <ctime>    //time

class MyQTreeWidgetItem :public QTreeWidgetItem
{
public :
	//Constructeur de MyQTreeWidgetItem.
	MyQTreeWidgetItem ( QTreeWidgetItem * parent, int type = Type ):QTreeWidgetItem(parent,type){};
	MyQTreeWidgetItem ( QTreeWidget * parent, int type = Type ):QTreeWidgetItem(parent,type){};

	//Reimplemente le test
	bool operator< ( const QTreeWidgetItem & other ) const
		{
		//On recupere la colonne utilisee pour le test
		const QTreeWidget * pTree =treeWidget ();
		//Si aucun TreeWidget n'est associe, on utilise la colonne 0
		int colonne   = pTree ? pTree->sortColumn() : 0;

		//On recupere les donnees sous forme de variant situé dans la colone
		QVariant  q1= data ( colonne , 0 );
		QVariant  q2= other.data ( colonne , 0 );
		//On verifie que les deux variants sont de même type
		if (q1.type() ==q2.type())
			{
			//Si se sont des int
			if (q1.type()==QVariant::Int)     return q1.toInt()<q2.toInt();
			//Si se sont des double
			if (q1.type()==QVariant::Double)     return q1.toDouble()<q2.toDouble();
			}
		//Sinon on appele le comparateur de la class mere "QTreeWidgetItem"
		return QTreeWidgetItem::operator<(other);
		}

};
	
		
int main(int argc, char* argv[])
{
	srand(time(NULL));
	QApplication app(argc, argv);

	QTreeWidget tree;
	//On remplit l'entete
	QStringList entete;
	entete << "int" << "double" ;
	tree.setHeaderItem(new QTreeWidgetItem((QTreeWidgetItem*)0,entete));
	tree.setSortingEnabled(true);

	//On cree une premiere branche avec des QTreeWidgetItem
	//Les items seront tries de manière lexicale
	QTreeWidgetItem *parentitem = new QTreeWidgetItem(&tree);
	parentitem->setText(0,"QTreeWidgetItem");
	for (int i=0;i<20;++i)
		{
		QTreeWidgetItem*item = new QTreeWidgetItem(parentitem);
		item ->setData (0, 0, QVariant(i));
		item ->setData (1, 0, QVariant(rand()/(1.+RAND_MAX)*i));
		}

	//On cree une deuxieme branche avec notre nouvelle classe
	//Les items seront tries de maniere numerique
	parentitem = new MyQTreeWidgetItem(&tree);
	parentitem->setText(0,"MyQTreeWidgetItem ");
	for (int i=0;i<20;++i)
		{
		MyQTreeWidgetItem *item = new MyQTreeWidgetItem(parentitem);
		item ->setData (0, 0, QVariant(i));
		item ->setData (1, 0, QVariant(rand()/(1.+RAND_MAX)*i));
		}

	tree.resize(400, 650);
	tree.expandAll();
	tree.show();
	return app.exec();
}
                
			

Comment trier un QListWidget ?
auteur : Yan Verdavaine
Les QListWidget trient leurs items avec l'operateur < des QListWidgetItem. Par défaut, cet opérateur compare deux QString. Malheureusement, ceci ne correspond pas toujours à ce que l'on souhaite. Pour y remédier, il suffit de créer sa propre classe d'item qui hérite de QListWidgetItem et qui redéfinit cet opérateur. Tout fonctionnera simplement grâce au polymorphisme.

Exemple : 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)


#include <QtGui>

class MyQListWidgetItem :public QListWidgetItem
{
public :
    //Constructeur de MyQListWidgetItem.
    MyQListWidgetItem ( QListWidget * parent, int type = Type ):QListWidgetItem(parent,type){};

   //Reimplemente le teste
   bool operator< ( const QListWidgetItem & other ) const
       {
       //On recupere les donnees 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 mere "QListWidgetItem"
       return QListWidgetItem::operator<(other);
       }

};


int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    //Viewer  de gauche
    QListWidget  * pList1 = new QListWidget;
    //On active le tri. Par defaut, le tri est par ordre croissant
    pList1->setSortingEnabled(true);
    //On utilise nos items. Le tri se fera par ordre numerique
     for (int i=0;i<20;++i)
       {
       QListWidgetItem*item = new MyQListWidgetItem(pList1);
       item ->setData ( 0, QVariant(i));
       }

    //Viewer  de droite
    QListWidget  * pList2 = new QListWidget;
    //On active le tri. Par defaut, le tri est par ordre croissant
    pList2->setSortingEnabled(true);
    //On utilise les QListWidgetItem. Le tri se fera par ordre lexicale
    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();
}
                
            

Comment ajouter un lien vers une page HTML ?
auteur : Yan Verdavaine
La façon la plus simple est d'utiliser un QLabel et ses possibilité de Rich text (http://doc.trolltech.com/4.3/richtext.html). Pour cela il suffit :

  • D'autoriser l'ouverture vers une page web
  • De remplir le label avec un petit morceau en HTML : <a href= 'site referencé'>XXXXX</a>. où XXX peut être
    • une phrase simple : une phrase simple
    • une phrase en HTML : <font size='S' family='...' color='C'> ... </font>
      • size : facultatif. Taille de la police
      • family : falcultatif. Police à utiliser dans l'ordre de préférence
      • color : couleur du text
      • Il est possible de compléter la phrase en utilisant les balises de formatage de texte comme gras(<b>...<\b>), italique (<i>...</i>)...

  • une image en HTML : <img src='MON_IMAGE' height ='H' width= 'W'>
    • src : path de l'image à afficher. Peut se situer dans les ressources
    • height : facultatif. Hauteur de l'image
    • width : facultatif. Largeur de l'image
exemple avec un lien text et un lien image


#include <QtGui>
 
int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QLabel label;
    //on ecrit un petit bout de html
    label. setText (    "La doc de"
			//lien par un text HTML
                        "<a href='http://doc.trolltech.com/4.3/qlabel.html'>" 
                                "<font size='15' family='Arial, Helvetica, sans-serif' color='green'><b> Qt </b></font>" 
                        "</a>"
                        "est voici "
			//lien par une image
                        "<a href='http://qt.developpez.com/faq/'>"
                            "<img src='FAQ-Qt.gif'>"
                        "</a>");
    //on autorise l'ouverture du lien vers le viewer par defaut
    label.setOpenExternalLinks ( true );
    label.show();
    return app.exec();
                
        

Comment afficher un gif animé ?
auteur : Yan Verdavaine
Comme un Gif animé est quelque chose de non statique, on ne peut pas afficher l'animation avec une QImage ou une QPixmap. Pour cela, Qt fournie une classe dédiée aux vidéos : QMovie.

La méthode la plus simple est de créer un QMovie avec le gif et de l'associer à un label.


#include <QtGui>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QLabel w;
    
    //On cree une video. Ici c'est un gif
    QMovie movie("c:/Mickey-11.gif");
    //On l'associe a un label
    w.setMovie (&movie);
    //On lance la video
    movie.start ();

    w.show();
    return app.exec();
}
				
			
Il faut tout de même préciser que la compilation du plugin Gif est nécessaire pour que ce code marche correctement.


Comment créer une page d'accueil ?
auteur : Shugo78
Qt propose la classe QSplashScreen pour simplifier la gestion des pages de démarrage. Une page de démarrage est une image affichée lors du démarrage d'un programme, pour masquer un démarrage lent ou tout simplement par marketing.

Remarque :

  • Cette page se fermera si l'on clique dessus
  • QSplashScreen est lancé avant la boucle d'événement de l'application, il est donc préférable d'appeler QApplication::processEvents() de temps en temps pour traiter les événements en cours..


#include <QtGui>
#include <windows.h> //Sleep


int main (int argc, char** argv)
{
    QApplication app (argc, argv);

    // Création de la page de demarrage
    QSplashScreen splash;
    //La page sera devant toute les fenetres
    splash.setWindowFlags ( Qt::WindowStaysOnTopHint);
    splash.setPixmap(QPixmap ("c:/figure1.jpg"));
    splash.show();

    //On ecrit sur l'image l'etape en cours
    splash.showMessage (QObject::tr ("Etape 1"), Qt::AlignRight | Qt::AlignTop, Qt::white);
    //On simule un traitement de durée 2s
    // /!\ pour Windows
    Sleep(2000);
     //On lance un traitement sur les evenements
    app .processEvents();

    //On change l'image
    splash.setPixmap(QPixmap ("c:/figure2.jpg"));
    //On ecrit sur l'image l'etape 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 evenements
    app .processEvents();

    QWidget w;
    w.show();
    //La page se fermera une fois le widget affiché
    splash.finish (&w);

    return app.exec ();
}

				
			

Comment afficher une image dans mon interface ?
auteur : IrmatDen
La méthode la plus simple est d'utiliser un QLabel conjointement à un QPixmap.


#include <QtGui>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QLabel label;
    //on donne l'image au label
    label.setPixmap(QPixmap("c :/image.png")); 
    label.show();
    QObject::connect(&label, SIGNAL(clicked()), &app, SLOT(quit()));
    return app.exec();
}
				
			

precedent    sommaire    suivant   

Consultez les autres F.A.Q's


Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2006  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érets. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com