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.