Il s'agit dans cet exemple de tracer la courbe de la fonction f (x) = m x2. C'est un curseur et le "slider" de Qt permettent la récupération de la valeur du paramètre m.
Répertoire : fparm_slider. Trois fichiers : main.cpp, appli.h et appli.cpp.
#include <QApplication> #include "appli.h" int main (int argc, char *argv []) { QApplication app (argc, argv); Fenetre f; f.show(); return app.exec (); }
On crée l'application app, le fenêtre principale f puis on lance la boucle d'exécution app.
#ifndef APPLI_H #define APPLI_H #include <QtGui> #include "geo2D/curseur.h" #include "geo2D/courbe.h" class mx2: public fonction { public: double m; mx2 (double m); double image (double x); };
La fonction dépendant d'un paramètre est une sur-classe de la classe fonction.
class Dessin: public QWidget { Q_OBJECT public: repere *R; mx2 *f; courbe *c; curseur *mcurs; bool presse; QSlider *slider;
Pointeur sur le curseur de Qt.
Dessin (QWidget *parent = 0); protected: void paintEvent (QPaintEvent *); void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); public slots: void slider_val (int nval); };
Méthode invoquée chaque changement de la valeur retournée par le "slider"
class Fenetre: public QWidget { Q_OBJECT public: Dessin *canvas; Fenetre (QWidget *parent = 0); }; #endif
/* * fparm_slider */ #include "appli.h" bool fonction::def (double) { return true; } double fonction::image (double) { return 0.0; } mx2::mx2 (double m) { mx2::m = m; } double mx2::image (double x) { return m * x * x; }
On construit ici l'ensemble de définition de la fonction carré mx2 et l'expression de l'image de x : m x2.
Dessin::Dessin (QWidget *parent): QWidget (parent) { setGeometry (0, 0, 600, 450); setMouseTracking (true); setCursor (Qt::ArrowCursor); presse = false; R = new repere (300, 225, 600, 450, 50.0, 50.0, 1.0, 1.0); double m = 1.0; mcurs = new curseur (-4.0, 4.0, m, 400, 100, 200, "m", R); f = new mx2 (m); c = new courbe (f, NULL, R); }
Constructeur de la feuille de dessin : on fixe la dimension et les paramètre puis on crée ici les 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); c -> trace (&painter); mcurs -> trace (&painter); }
On redessine ici la figure : on peint le fond en blanc, on trace le repère en rouge puis le curseur et la courbe.
void Fenetre::mousePressEvent (QMouseEvent *event) { int X = event -> x (); int Y = event -> y (); presse = mcurs -> select (X, Y) || mcurs -> select_curseur (X, Y); if (presse) setCursor (Qt::ClosedHandCursor); }
On teste, dans cet ordre, si la souris est proche du bouton du curseur puis du curseur lui-même.
void Dessin::mouseMoveEvent (QMouseEvent *event) { int X = event -> x (); int Y = event -> y (); if (presse) { mcurs -> bouge (X, Y); mcurs -> bouge_curseur (X, Y); double m = mcurs -> valeur (); f -> m = m; slider -> setValue ((int) (m * 25.0 + 100)); update ();
On met à jour le paramètre, le bouton du curseur de Qt puis on relance le tracé..
} else { if (mcurs -> zone (X, Y) || mcurs -> zone_curseur (X, Y)) setCursor (Qt::PointingHandCursor); else setCursor (Qt::ArrowCursor); } }
Si on bouge la souris sans appuyer sur le bouton en change simplement le curseur à proximité du curseur ou de son bouton.
void Fenetre::mouseReleaseEvent (QMouseEvent *) { mcurs -> stop ();
mcurs -> stop_curseur (); presse = false; setCursor (Qt::PointingHandCursor); }
On relâche de bouton de la souris : on remet alors tous les indicateurs de déplacement à FALSE puis on change le curseur.
void Dessin::slider_val (int nval) { double m = 0.04 * nval - 4.0; f -> m = m; mcurs -> val = m; update (); }
Si on modifie la position du bouton du curseur de Qt, on met à jour le paramètre m et la position du curseur de la feuille de dessin.
Fenetre::Fenetre (QWidget *parent): QWidget (parent) { setGeometry (0, 0, 600, 500); canvas = new Dessin (parent); canvas -> slider = new QSlider (Qt::Horizontal); canvas -> slider -> setRange (0, 200); canvas -> slider -> setValue (125); connect (canvas -> slider, SIGNAL (valueChanged (int)), canvas, SLOT (slider_val (int))); QVBoxLayout *vboite = new QVBoxLayout; vboite -> addWidget (canvas -> slider); vboite -> addWidget (canvas); setLayout (vboite); }
Constructeur de la fenêtre principale : on crée et on monte verticalement dans cett fenêtre un curseur et la feuille de dessin.