Variante du programme précédent : ajout d'un bouton pour modifier le mode sens_trigo.
Répertoire : arc_bouton. Trois fichiers sont utilisés : main.cpp, appli.h et appli.cpp.
#include "appli.h" int main (int argc, char *argv []) { QApplication app (argc, argv); Fenetre f; f.show(); return app.exec (); }
#ifndef APPLI_H #define APPLI_H #include <QtGui> #include "geo2D/point_libre.h" #include "geo2D/arc_cercle.h" class Dessin: public QWidget { Q_OBJECT public: repere *R; point_libre *A; point_libre *B; point_libre *C; arc_cercle *ABC; bool presse; QPushButton *bouton; QLabel *lbl;
Pointeurs sur le label qui contient l'état de l'indicateur sens_trigo sur le bouton.
Dessin (QWidget *parent = 0); protected: void paintEvent (QPaintEvent *); void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); public slots: void action (); };
action () : méthode invoquée lors d'un appui sur le bouton.
class Fenetre: public QWidget { Q_OBJECT public: Dessin *canvas; Fenetre (QWidget *parent = 0); }; #endif
Fenêtre principale contenant le "label", le bouton et le dessin.
/* * arc_bouton */ #include "appli.h" Dessin::Dessin (QWidget *parent): QWidget (parent) { setGeometry (0, 0, 600, 450); setMouseTracking (true); setCursor (Qt::ArrowCursor); presse = false;
Construction de la fenêtre contenant le dessin.
R = new repere (300, 225, 600, 450, 50.0, 50.0, 1.0, 1.0); A = new point_libre (1.0, 0.0, "A", R); B = new point_libre (0.0, 0.0, "B", R); C = new point_libre (0.0, 2.0, "C", R); ABC = new arc_cercle (A, B, C, "ABC", R); ABC -> sens_trigo = true; }
Création des objets géométriques.
void Dessin::paintEvent (QPaintEvent *) { setPalette (QPalette (QColor (255, 255, 255))); setAutoFillBackground (true); QPainter painter (this); painter.setPen (Qt::red); (*R).trace (&painter); painter.setPen (Qt::blue); A -> trace (&painter); B -> trace (&painter); C -> trace (&painter); ABC -> trace (&painter); }
Tracé de la figure
void Dessin::mousePressEvent (QMouseEvent *event) { int X = event -> x (); int Y = event -> y (); presse = A -> select (X, Y) || B -> select (X, Y) || C -> select (X, Y); if (presse) setCursor (Qt::ClosedHandCursor); } void Dessin::mouseMoveEvent (QMouseEvent *event) { int X = event -> x (); int Y = event -> y (); if (presse) { A -> bouge (X, Y); B -> bouge (X, Y); C -> bouge (X, Y); ABC -> arc_cercle_pt_pt_pt (A, B, C); update (); } else { bool proche = A -> zone (X, Y) || B -> zone (X, Y) || C -> zone (X, Y); if (proche) setCursor (Qt::PointingHandCursor); else setCursor (Qt::ArrowCursor); } } void Dessin::mouseReleaseEvent (QMouseEvent *) { A -> stop(); B -> stop(); C -> stop(); presse = false; setCursor (Qt::PointingHandCursor); } void Dessin::action () { ABC -> sens_trigo = ! ABC -> sens_trigo; if (ABC -> sens_trigo) lbl -> setText ("sens_trigo = TRUE"); else lbl -> setText ("sens_trigo = FALSE"); }
Méthode invoquée lors de l'appui sur le bouton. On inverse l'indicateur sens_trigo et on met à jour le "label".
Fenetre::Fenetre (QWidget *parent): QWidget (parent) { setGeometry (0, 0, 600, 500); canvas = new Dessin (parent); canvas -> lbl = new QLabel ("sens_trigo = TRUE"); canvas -> bouton = new QPushButton ("Bascule \"sens_trigo\"", this);
Création de la feuille de dessin, du label et du bouton.
connect (canvas -> bouton, SIGNAL (clicked ()), canvas, SLOT (action ()));
Cette instruction permet de relier chaque "clic" sur le bouton à la méthode action().
QHBoxLayout *hboite = new QHBoxLayout; QVBoxLayout *vboite = new QVBoxLayout; hboite -> addWidget (canvas -> lbl); hboite -> addWidget (canvas -> bouton); vboite -> insertLayout (0, hboite); vboite -> addWidget (canvas); setLayout (vboite); }
On monte le label et le bouton dans un boîte horizontalement puis la boîte et le dessin dans une autre boîte en position verticale.