IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Débuter dans la création d'interfaces graphiques avec PyQt 4

Image non disponible


précédentsommairesuivant

XI. Avec un canon, on peut tout faire

Image non disponible

Dans cet exemple, nous nous attaquons au graphique, en dessinant un joli petit canon. Il n'y a que cannonfield.cpp qui change par rapport au chapitre précédent.

XI-A. Analyse du code ligne par ligne

XI-A-1. t9/cannonfield.cpp

 
Sélectionnez
 void CannonField::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);

Nous allons maintenant commencer à utiliser sérieusement QPainter. Nous créons un outil de peintre ("painter") qui va permettre de travailler sur ce widget.

 
Sélectionnez
    painter.setPen(Qt::NoPen);

Les bords du dessin de QPainter sont toujours faits avec un crayon. Ici, nous le configurons à Qt::NoPen, ce qui veut dire qu'il n'y aura pas de bord spécial quand nous dessinerons quelque chose.

 
Sélectionnez
    painter.setBrush(Qt::blue);

Quand QPainter remplit un rectangle, un cercle ou n'importe quoi d'autre, il remplit la forme avec sa brosse. Ici, nous le configurons pour qu'il utilise une brosse réalisant des aplats de couleur bleue. Nous aurions également pu utiliser un motif. La brosse bleue va remplir toute la surface limitée par les traits que nous allons dessiner.

 
Sélectionnez
    painter.translate(0, rect().height());

Cette fonction traduit le système de coordonnées de QPainter (il le définit par une translation). Ici, nous plaçons le point (0,0) au coin inférieur gauche du widget. Les directions X et Y restent inchangées : toutes les coordonnées y dans le widget sont donc négatives (voir The Coordinate System pour plus d'informations à propos du système de coordonnées de Qt).

 
Sélectionnez
    painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16);

La fonction QPainter::drawPie() dessine un camembert dans un rectangle (spécifié par quatre données) à partir d'un angle de départ et de la longueur d'un arc. Les angles sont spécifiés en 16e de degrés. Le zéro est situé dans la direction horaire correspondant à 3 heures. Le sens du dessin est anti-horaire (trigonométrique). Ici, nous dessinons un quart de cercle dans le coin inférieur gauche du widget. Le camembert est rempli avec du bleu, sans contour.

 
Sélectionnez
    painter.rotate(-currentAngle);

La fonction QPainter::rotate() fait tourner le système de coordonnées du QPainter autour de l'origine. L'argument de la rotation est un nombre à virgule flottante, exprimé en degrés (et non en 16e de degrés comme précédemment !) et dans le sens horaire. Ici nous tournons le système de coordonnées de currentAngle degrés dans le sens anti-horaire.

 
Sélectionnez
    painter.drawRect(QRect(30, -5, 20, 10));

La fonction QPainter::drawRect() dessine le rectangle spécifié. Ici, nous dessinons l'orifice du canon.

Il est souvent difficile de prévoir le résultat quand le système de coordonnées a été transformé (translaté, tourné, réduit, décalé) comme ci-dessus.

Dans ce cas, le système de coordonnées est d'abord translaté, puis tourné. Si le rectangle QRect(30, -5, 20, 10) avait été dessiné dans le système de coordonnées translaté, il aurait ressemblé à cela :

Image non disponible

Notez que le rectangle est fixé au bord du widget CannonField. Puis, nous tournons le système de coordonnées, par exemple de 60 degrés : le rectangle sera tourné autour de (0,0), qui est le coin inférieur gauche car nous avons translaté le système de coordonnées. Le résultat ressemble à cela :

Image non disponible

XI-B. Exécuter l'application

Quand la position du curseur (slider) évolue, l'angle du canon dessiné change, en accord avec cette valeur.

Le 'Q' sur le bouton Quit est maintenant souligné, et Alt+Q permet de l'activer.

XI-C. Exercices

Au lieu de spécifier Qt::NoPen, définissez un "vrai" crayon.

Essayez "Q&uit" ou "Qu&it" comme texte de bouton au lieu de "&Quit". Que se passe-t-il ?


précédentsommairesuivant

Copyright © 2009 - 2021 Developpez.com LLC Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.