Arc de cercle

Variante du programme précédent : ajout d'un bouton pour modifier le mode sens_trigo.

arc_bouton.png

Répertoire : arc_bouton. Trois fichiers sont utilisés : main.cpp, appli.h et appli.cpp.

main.cpp

#include "appli.h"

int main (int argc, char *argv []) {
     QApplication app (argc, argv);
     Fenetre f;
     f.show();
     return app.exec ();
}

appli.h

#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.

appli.cpp

/*
 * 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.