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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques Discussion :

Tracer un graphique avec openPTC ou Qwt


Sujet :

Bibliothèques

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut Tracer un graphique avec openPTC ou Qwt
    bonjours a tous,
    voila j'ai besoin d'afficher un graphique d'apres un taleau a une seul dimensions,
    j'ai regarder la documention de Qt mais je ne voit pas vraiment quelle bibliotheque me permettrais de faire sa (assez simplement).
    j'ai entendu parlé aussi de openPTC, mais c'est quelque chose qui a l'air assez vieux et il n'y a pas beaucoup d'information sur internet ... je voudrais savoir si quelqu'un a deja entendu parler de sa ?

    j'ai aussi essayer d'installer Qwt mais c'est ratée aussi ... je n'ai pas compris leur documentation.

    sinon je peut eventuellement tracer des rectangle cote a cote d'une certaine largeur et hauteur qui formeront un diagramme mais je ne voit pas trop comment m'y prendre.

    Si vous avez des informations, des conseil ou des idée je serait ravi de les lirent !

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Sinon mon tableau contient dans chaque case une valeur qui va definir la hauteur de la "courbe".

    est-ce possible d'afficher en consoles des rectangles (avec Qt ou autre, ou former de " * " ) ? Sachant que ces rectangle doivent etre de la hauteur de Tableau[n] (la valeur contenu dans la case du tableau) et de largeur 1.

  3. #3
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Je sais pas s'il existe des trucs tout fait pour ça dans Qt, mais ça peut se faire facilement. Il faut que tu crée un Widget (héritant de QWidget), puis que tu réimplémente la fonction paintEvent.

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    class RecWidget : public QWidget {
    	Q_OBJECT
    	std::vector<int> m_data;
     
    public:
    	RecWidget(QWidget *parent = nullptr):
    		QWidget(parent)
    	{
    		m_data.push_back(80);
    		m_data.push_back(100);
    		m_data.push_back(130);
    		m_data.push_back(30);
    		m_data.push_back(95);
    	}
    	virtual ~RecWidget() { }
     
    protected:
    	void paintEvent(QPaintEvent *evt) {
    		QPainter p(this);
     
    		int last_y = m_data[0];
    		int last_x = 0;
    		int offset_x = 25;
    		int offset_y = 200;
     
    		for(int i=1; i<m_data.size(); ++i) {
    			QLine line(last_x, offset_y-last_y, last_x+offset_x, offset_y-m_data[i]);
    			p.drawLine(line);
    			last_x += offset_x;
    			last_y = m_data[i];
    		}
    	}
    };
    (Il faut juste penser à inverser l'axe vertical : il est orienté de haut en bas.)
    Images attachées Images attachées  

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Merci de ta réponse,

    Je vient de regarder des cours sur l'héritage et je ne comprend pas très bien les premieres lignes
    class RecWidget : public QWidget {
    Q_OBJECT
    std::vector<int> m_data
    ;
    Ainsi que :
    RecWidget(QWidget*parent = nullptr):
    QWidget(parent)
    et :

    void paintEvent(QPaintEvent *evt) {
    QPainter p(this);
    De plus, si je comprend bien:
    -Nous créons un nouveau Widget avec la classe recWidget, qui hérite de Qwidget.
    -On fait une nouvelle implementation de la fonction PaintEvent, celle-ci étant présente dans la classe mère Qwidget.

    j'espère que j'ai bon au moins sur ces deux point.

  5. #5
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Q_OBJECT est une macro "magique" de Qt, c'est à utiliser dans toutes les classes héritant de QObject (ou peut être seulement utile lorsqu'on utilise des slots/signaux).

    Le vector est là pour contenir les données à afficher (les points du graphe). Un vector est en gros l'équivalent d'un tableau sauf que la mémoire est gérée automatiquement.
    Dans ton cas le vector (ou QVector) obtiendra très probablement ses valeurs depuis un slot.

    Le constructeur de RecWidget prend un pointeur sur son parent (cad le widget qui le contient) en paramètre, par défaut il vaut NULL (= pas de parent). On transmet ce paramètre à QWidget, car c'est elle qui en à besoin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void paintEvent(QPaintEvent *evt) {
       QPainter p(this);
    Ici rien de spécial paintEvent prend un pointeur sur un QPaintEvent en paramètre (c'est comme ça qu'elle est définie, c'est fixé par Qt).
    Et le QPainter permet de dessiner dans le widget.
    Citation Envoyé par tom250908 Voir le message
    De plus, si je comprend bien:
    -Nous créons un nouveau Widget avec la classe recWidget, qui hérite de Qwidget.
    -On fait une nouvelle implementation de la fonction PaintEvent, celle-ci étant présente dans la classe mère Qwidget.

    j'espère que j'ai bon au moins sur ces deux point.
    Exactement.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    d'accord, sa devient plus clair, maintenant pour pouvoir implémenter mon code à partir de cette exemple je me pose deux questions :

    m_data.push_back(80);
    m_data.push_back(100);
    m_data.push_back(130);
    m_data.push_back(30);
    m_data.push_back(95);
    1-Les nombres entrées en paramètres de la fonction push_back() sont déterminer comment ? c'est surement juste pour l'exemple, mais quelle impact, le fait d'agrandir le tableau à-t-il graphiquement ?

    2-Le compilateur ne reconnait pas la bibliothèque lors de l'inclusion :
    j’espère que c'est une erreur d'implémentation plutôt qu'une mauvaise installation de Qt ...

    merci de m'accorder ce temp

  7. #7
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    1 - chaque nombre représente la coordonnée Y d'un point, ici il y à donc 5 points (et 4 droites) sur le graphe. (Des nombres pris au hazard ici, juste pour l'exemple.)

    2 - Il faut ajouter le chemin vers les includes de Qt à ton projet. Tu auras aussi besoin d'ajouter le chemin où trouver les librairies, et tu devrais link avec au moins QtCore.lib et QtGui.lib.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    2 - Il faut ajouter le chemin vers les includes de Qt à ton projet. Tu auras aussi besoin d'ajouter le chemin où trouver les librairies, et tu devrais link avec au moins QtCore.lib et QtGui.lib.
    oula ... Je ne connaissait même pas l'existence des fichier .lib !
    qu'est-ce que "link" ? Je pensais qu'un makefile pourrait régler le problème ... un truc dans le genre ?

  9. #9
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    La génération d'un exe se passe en 2 phases (mettons de coté le précompileur^^)

    D'abord la compilation : chaque fichier source (.cpp) donne un fichier objet (.o ou .obj), ces fichiers objets contiennent seulement le code présent dans les sources compilées.

    Ensuite arrive le link (édition de liens) : tous les fichiers objets sont regroupés en un fichier unique -> ton exe.

    Il arrive d'utiliser des librairies (c'est le cas de Qt par exemple) qui soit fournie sous la forme d'entêtes (les .h) et de librairies (.lib et .dll sous Windows).
    Les lib contiennent la description d'une DLL, et les DLL sont "comme des fichiers objet" : elles contiennent du code compilé.

    Il faut donc ajouter les .lib à son projet (faut chercher dans les propriétés du projet, dans ton IDE, ou les ajouter dans ton makefile), et fournir les DLL avec son exe.

    Pour savoir qu'elle .lib tu as besoin, il faut regarder la doc de Qt.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    ok, bon donc sa c'est regler mais pour la suite du code j'aurai besoin d'explication ...

    Citation Envoyé par Iradrille Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    protected:
    	void paintEvent(QPaintEvent *evt) {
    		QPainter p(this);
    
    		int last_y = m_data[0];
    		int last_x = 0;
    		int offset_x = 25;
    		int offset_y = 200;
    
    		for(int i=1; i<m_data.size(); ++i) {
    			QLine line(last_x, offset_y-last_y, last_x+offset_x, offset_y-m_data[i]);
    			p.drawLine(line);
    			last_x += offset_x;
    			last_y = m_data[i];
    		}
    	}
    };
    J'ai du mal à voir a quoi corresponde les variables, surtout parce que je ne comprend pas la ligne avec Qline. C'est une methode de QWidget à laquelle on fait appel ou quelque chose comme sa ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    La ligne avec QLine fait appel au constructeur QLine::QLine ( int x1, int y1, int x2, int y2 ), qui construit donc une ligne entre les points de coordonnées (x1, y1) et (x2, y2), soit ici entre les points (last_x , offset_y-last_y) et (last_x+offset_x , offset_y-m_data[i]) ; que l'on dessine ensuite avec la ligne p.drawLine(line);.

    On trace au final chaque ligne reliant les points de coordonnées (i*25, 200-m_data[i]) et ((i+1)*25, 200-m_data[i+1])

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    ok trés bien , pour mon graphique j'ai besoin que c'est point soit pris d'un tableau, Histo[256].

    Enfaite les coordonées en X evolue de 1 en 1, donc X1 = i et X2 = i+1
    au niveau des Y, j'ai ce fameux tableau de 256 case, qui au point d'abscisse 0 aura la valeur tableau[0].

    Donc je n'ait qu'un seul compteur de boucle, qui est i
    j'obtient donc le code suivant (.h) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #ifndef DEF_GRAPH
    #define DEF_GRAPH
     
    #include <iostream>
    #include <QWidget>
    #include <vector>
     
    class graphWidget : public QWidget
    {
    	Q_OBJECT
    	std::vector <int> data;
     
    public :
    	graphWidget (QWidget *parent = nullptr): QWidget (parent)
    	{
    		data = 0;
    	}
    	virtual ~graphWidget() { }
     
    protected :
    	void paintEvent(QPaintEvent *evt, tab[256] ) 
    	{
    		QPainter p(this);
     
    		for( int i = 0; i < 257; i++)
    		{
    			Qline line (i, tab[i], i+1, tab[i+1]);
    			p.drawLine(line);
    		}
    };
     
    #endif
    j'ai deux probleme :

    1- l'initialisation de data dans le constructeur semble inutile ... je sais pas trop comment faire et si les push_back sont utiles etant donné que j'ai deja un tableau...

    2- est-ce que je doit créer un fichier .cpp en plus du .h ?

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    J'avance un peu, j'ai ce code la maintenant (pas tellement différent du précedent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class graphWidget : public QWidget
    {
    	Q_OBJECT
     
    public :
    	graphWidget (QWidget *parent = nullptr): QWidget (parent)
    	{
    		tab[256];
    	}
    	virtual ~graphWidget() { }
     
    protected :
    	void paintEvent(QPaintEvent *evt, tab[256] ) 
    	{
    		QPainter p(this);
     
    		for( int i = 0; i < 257; i++)
    		{
    			Qline line (i, tab[i], i+1, tab[i+1]);
    			p.drawLine(line);
    		}
     
    private :
    	int tab[256];
    };
    Si ensuite dans mon main j'apelle la tableau de la maniere suivante, je pense que sa devrait marcher non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Histogram::DisplayHistogram()
    {
    	graphWidget Display;
    	Display.paintEvent(QPaintEvent *evt, Histo);
    }
    Je ne peut pas executer en ce moment j'ai un petit probléme avec le debugger de visual ...

    Et je me demandé aussi si il n'y avais pas une fonction a appelé, étant donnée que le graphique va evoluer au fur et a mesure que les image sont acquise, qui actualiserai le contenu du widget.
    Pour eviter que le programme m'ouvre un nouveau widget a chaque image envoyer par la camera ... deja a 3 image seconde je vous laisse imaginer la tête de l'écran ...

  14. #14
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par tom250908 Voir le message
    J'avance un peu, j'ai ce code la maintenant
    Pas sur qu'on puisse appeler ça un avancement

    Le prototype de paintEvent est fixé, tu ne peux pas le changer.
    Ce n'est pas non plus une fonction à appeler directement.
    Il y à d'autres fonctions à appeler pour ça, genre repaint. Cela permet d'être sûr que le widget, ainsi que tous ses éventuels fils seront redessinés.

    Pour passer des données au widget qui dessine le graphe, il faut utiliser des slots/signals. C'est la façon de faire de Qt, et ça marche assez bien. (Basé sur le pattern observateur)

    En gros tu auras un model (au sens MVC du terme) qui va te générer les données du graphe, il va signaler que ces données sont prêtes grâce à un signal.
    Ce signal sera connecté à un slot de ton widget, ainsi tu sais quand il faut redessiner, et tu as les nouvelles données (reçues directement dans ton slot)

    Je te conseil de passer quelques heures à lire la doc de Qt, en particulier tout ce qui traite des signals, slots, création de widget personnalisés, paintEvent.

    Ça te permettra de mieux comprendre pourquoi ce que tu fais ne vas pas, et comment faire pour que ça marche.

    En pièce jointe, un rapide exemple de ce que j'explique.

    Au passage, les deux commandes de qmake à absolument connaitre quand on bosse avec Visual Studio :
    qmake -project -> génère un fichier .pro à partir des sources (souvent à modifier un peu).
    qmake -tp vc -> crée un fichier projet VS à partir d'un fichier .pro
    Fichiers attachés Fichiers attachés

  15. #15
    Invité
    Invité(e)
    Par défaut
    Autre petite remarque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for( int i = 0; i < 256; i++)
    Pour un tableau de taille N, les indices vont de 0 à N-1.

  16. #16
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Autre petite remarque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for( int i = 0; i < 256; i++)
    Pour un tableau de taille N, les indices vont de 0 à N-1.
    et même N-2, vu qu'on utilise i+1 dans la boucle.

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    ok bon je vais corrigé tout sa, me documenter sur Qt et je post mon code quand il aura bien changé (cette fois )

Discussions similaires

  1. Tracer un graphique avec une macro
    Par mohand78 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/02/2015, 01h07
  2. [Débutant] Tracer un graphique avec Excel
    Par Tom dB dans le forum MATLAB
    Réponses: 11
    Dernier message: 05/06/2013, 14h13
  3. Problèmes pour tracer des graphiques avec une macro
    Par Margoooot dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/08/2011, 17h19
  4. [AC-2003] Tracer un graphique avec 2 courbes décalées
    Par guidav dans le forum IHM
    Réponses: 1
    Dernier message: 31/01/2011, 20h31
  5. Tracer un graphique 3D avec f(x,y) inconnue
    Par StitchP dans le forum MATLAB
    Réponses: 4
    Dernier message: 22/08/2007, 13h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo