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

Qt Discussion :

Affichage courbe dynamique


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 25
    Points
    25
    Par défaut Affichage courbe dynamique
    Bonjour,[/INDENT]J’utilise Qt afin de développer une application. Dans celle-ci je doit faire un affichage de plusieurs courbes. J’utilise la bibliothèque Qwt (plus précisément qwtPlot et QwtplotCurve) pour afficher ma première courbe sur une nouvelle page. Maintenant je souhaite crée dynamiquement une (ou plusieurs) page identique, et tracée une courbe différente (une courbe par page crée). Sachant que toutes les courbes devront être rafraîchie régulièrement (par un timer à 200ms). [/INDENT]Je pense utilisée un conteneur, ou quelque chose de ce style mais je suis dans le flou depuis un moment, bref si quelqu’un a une idée sur la manière de procéder, je serait heureux de l’écouter.
    Merci d’avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 93
    Points
    93
    Par défaut
    Qu'est-ce qu'une page dans ce contexte exactement ? Il devrait suffire de retracer toutes les courbes à chaque déclenchement du timer. Quel est le problème exact ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 25
    Points
    25
    Par défaut reformulation
    En faite-je souhaite créer autant de page contenant juste un graphique avec sa courbe à partir d’une page vide qui servirait de référence. Par la suite toutes les courbes/pages seraient rafraîchie par le timer. Mais actuellement dès que je demande la création d’une nouvelle page, il stop le rafraîchissement de la précédente et augmente la vitesse de mon timer. Voilà. Désoler si j ai du mal à être claire mais c’est vraiment flou dans a tête.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 93
    Points
    93
    Par défaut
    Mais qu'est-ce qu'une page ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Salut,
    Merci de m’aider mais je débute avec Qt, et désoler si des fois j’ai du mal à comprendre.
    Voila ma page est un Qwidget auquel j'ajoute un Qwtplot (avec un layout horizontal). Bref voila comment ma page est codée :
    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
    void page_visualisation1::creation_page()
    {
    	page_visualisation1Class = new page_visualisation1();	
     
    	//met un titre sur la page et créé une surface ou tracée la courbe
    	QString titre("Variable X");
    	myPlot = new QwtPlot(titre, page_visualisation1Class);
     
    	//créé un layout et intègre les éléments 
    	QHBoxLayout *layout;
    	layout = new QHBoxLayout(page_visualisation1Class);
        layout->addWidget(myPlot);
     
    	//dimmenssionne et affiche la page
    	page_visualisation1Class->resize(600,300);
    	page_visualisation1Class->show();
    Ensuite j’ai un timer qui initialise tous les intervalles « time » ma fonction dessiner :
    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
    void page_visualisation1:: dessiner()
    {
    	//Créé la courbe
    courbe1 = new QwtPlotCurve("Courbe : 1");
     
    	//appel acquisition data afin d'initialiser les deux tableaux
    acquisition_data();
     
    	//prend en compte data et les attaches à la courbe
    courbe1->setData(x,y,Size);
    courbe1->attach(myPlot);
     
    	//courbe rouge
    courbe1->setPen(QPen(Qt::red));
    	//style de la courbe : lines
    courbe1->setStyle(QwtPlotCurve::Lines);
     
    	//définit l'axe x de l'echelle
    myPlot->setAxisScale(QwtPlot::xBottom,min,max);
     
    //regarde si grapique arrive à la limite de l'axe x
    if (cpt<=clean)
    myPlot->replot();	//Si non : rafraichie la courbe
    else				//Si oui :
    {
    	myPlot->clear();	//efface courbe
    	myPlot->replot();	//dessine nouvelle courbe
    	clean=clean+(Size*pas_scale*(1000/(time)));		//calcul la nouvelle limite sur l'axe x
    	min=max;		//nouveau minimum sur l'echelle x
    	max=max+pas_scale;	//nouveeau maximum sur l'echelle y
    }
    Je m'explique le but est de pouvoir à chaque appel de la fonction creation_page, de crée une nouvelle page(chaque page avec une courbe différente). sachant que je ne sais pas à l'avance combien de courbe j'aurais à tracée.
    Le problème pour le moment est qu'il ma créé bien une nouvelle page, mais il stop le rafraîchissement de la précèdent, et augmente le rythme du timer.

    J'espères que c'est compréhensible, et de nouveau merci.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 93
    Points
    93
    Par défaut
    Je suis désolé, je ne comprends toujours pas très bien, mais ça peut fort bien être ma faute. Je crois que le problème ne vient pas du code qui a été déjà montré ici mais du déclenchement du timer qui appelle ce code. Mais il faudrait que je comprenne le contexte pour être sûr. Le mieux serait d'écrire un programme d'exemple minimal et compilable (30-40 lignes) qui reproduise le problème.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Bon en faite j'ai réussi à régler une partit du problème : sa venait du "this" dans le timer qui ne pointait pas au même endroit qu'un autre pointeur qui devait être identique (bref j'ai trouvé en bidouillant mais j ai pas compris pourquoi cette partit fonctionnait).Mais maintenant j'ai une autre erreur (elle m'empêche de tester ma solution -> je ne sais toujours pas si sa peut fonctionner. Celle-ci ce produit à l'exécution, lorsque que j'arrive sur *myPlot (sauf sur la ligne de déclaration et de la création avec le new). Il me met l'erreur suivante :

    Unhandled exception at 0x1005c711 in Polux_application.exe: 0xC0000005: Access violation reading location 0xcdcdcdd5.
    Elle se produit dans le fichier suivant : qatomic_windows.h
    J'aimerais des pistes quant à savoir d'où sa provient.(Le code a été modifié en partit donc si besoin je peux le remettre sur le forum, mais il y a plus de 130 lignes).
    Bon je te remercie et si tu peu pas m'aider c'est que je ne suis pas clair ne t'affole pas mais je débute avec Qt.

    A+

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Bon en faite j'ai réussi à régler une partit du problème : sa venait du "this" dans le timer qui ne pointait pas au même endroit qu'un autre pointeur qui devait être identique (bref j'ai trouvé en bidouillant mais j ai pas compris pourquoi cette partit fonctionnait).Mais maintenant j'ai une autre erreur (elle m'empêche de tester ma solution -> je ne sais toujours pas si sa peut fonctionner. Celle-ci ce produit à l'exécution, lorsque que j'arrive sur *myPlot (sauf sur la ligne de déclaration et de la création avec le new). Il me met l'erreur suivante :

    Unhandled exception at 0x1005c711 in Polux_application.exe: 0xC0000005: Access violation reading location 0xcdcdcdd5.
    Elle se produit dans le fichier suivant : qatomic_windows.h
    J'aimerais des pistes quant à savoir d'où sa provient.(Le code a été modifié en partit donc si besoin je peux le remettre sur le forum, mais il y a plus de 130 lignes).
    Bon je te remercie et si tu peu pas m'aider c'est que je ne suis pas clair ne t'affole pas mais je débute avec Qt.

    A+

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Désoler le message à été poster deux fois.....

  10. #10
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Peux-tu poster la ligne où ça crash ainsi que les précédentes jusqu'à création du pointeur? Sans ça, personne ne pourra pas te dire pourquoi ça crash

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ce crash indique que ton pointeur n'est pas initialisé - un pointeur non initialisé sous Visual a une adresse avec des cdcdcdcd -

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Voila j'ai trouvé la solution, en faite le crash venait d'un problème d'initialisation de ma classe (je l'initialisait deux fois) par un tour de magie que je ne comprenais pas. Après le pointeur this me créait cette erreur. Merci à tous de m'avoir dirigée vers les bonnes solutions. Je mets mon code (qui maintenant fonctionne) pour ceux que cela intéresse.

    le fichier.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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #ifndef PAGE_VISUALISATION1_H
    #define PAGE_VISUALISATION1_H
     
    #include <QtGui/QMainWindow>
    #include "ui_page_visualisation1.h"
    #include <Qwt_Plot.h>
    #include <QLayout.h>
    #include <QMenuBar.h>
    #include <QMenu.h>
    #include <Qwt_Plot_Curve.h>
    #include <QTimer.h>
    #include <QVector.h>
     
     
    #define time 200				//définit le temps de rafraichissement du graphique (timer)
    #define taille_data 1			//définit la taille des buffers pour recevoir les datas
     
    class Qmenu;
    class page_visualisation1 : public QWidget
    {
    	Q_OBJECT
     
    public:
    	//construteur
    	page_visualisation1(QWidget *parent = 0);
    	//destructeur
    	~page_visualisation1();
    	//Crée la page
    	void creation_page(int echelle=10);
     
     
    private:
    	Ui::page_visualisation1Class ui;
    	double cpt;		//compteur des coup du timer afin d'afficher les variables en fonction du temps
    	int pas_scale;  //définit l'echelle x du graphique  
    	int min;		//définit le minimum de l'echelle sur l'axe x
    	int max;		//définit le maximum de l'echelle sur l'axe x
    	double clean;	//compare avec cpt afin de savoir quand nettoyer l'affichage
    	QwtPlot* myPlot;
    	QHBoxLayout *layout;
    	QMenuBar*  menubar;
    	QMenu * menuFichier;
    	QwtPlotCurve* courbe;
    	QTimer *timer;
    	QVector<double> x;	//data pour l'axe x -> temps en s
        QVector<double> y;	//data pour l'axe y -> à acquérir pour la suite
     
    private slots:
     
    	//appel buffer_data pour y et construit data
    	void acquisition_data();
    	//dessine et rafraichie le graphique
    	void dessiner();
    	//initialise et execute le timer
    	void base_temps();
    	void creer_menu();
    	void creer_courbe();
    };
    #endif // PAGE_VISUALISATION1_H
    et le point cpp :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
     
    #include "page_visualisation1.h"
    #include <QString.h>
    #include <QColor>
    page_visualisation1::page_visualisation1(QWidget *parent)
    	: QWidget(parent)
    {	
    ui.setupUi(this);
     
    //initialise l'ensemble des variables
    cpt=0;
    min=0;
    x.clear();
    y.clear();
    }
     
    page_visualisation1::~page_visualisation1()
    {
    }
    void page_visualisation1::acquisition_data()
    {
    	//remplis les vecteurs data x et y avant de les afficher
    for(int i=0;i<taille_data;i++)
    	{
    	cpt++;
    	x.append((cpt*time)/(1000*taille_data));
    	y.append(((cpt*time)/(500*taille_data)));
    	}
    	//prend en compte data et les attaches à la courbe
    courbe->setData(x.data(),y.data(),y.size());
    }
     
    void page_visualisation1::dessiner()
    {
    	//appel acquisition data afin d'initialiser les deux tableaux
    acquisition_data();
    	//regarde si grapique arrive à la limite de l'axe x
    if (cpt<=clean)
    	myPlot->replot();	//Si oui : rafraichie la courbe
    else				//Si non :
    	{
    	myPlot->clear();	//efface courbe
    	clean=clean+(taille_data*pas_scale*(1000/(time)));		//calcul la nouvelle limite sur l'axe x
    	min=max;		//nouveau minimum sur l'echelle x
    	max=max+pas_scale;	//nouveau maximum sur l'echelle y
    	x.clear();
    	y.clear();
    	creer_courbe();
    	myPlot->replot();
    	}
    }
    void page_visualisation1::base_temps()
    {
    	//Appel la fonction dessiner afin de rafraichir le graphique tous les interval définit par time
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()),this, SLOT(dessiner()));
    timer->start(time);
    }
    void page_visualisation1::changer_echelle_temps()
    {
    Echelle_de_temps1 appel;
    appel.Change_echelle();
    close();
    }
    void page_visualisation1::creer_courbe()
    {
    	//Créé la courbe
    courbe = new QwtPlotCurve("Courbe : 1");
    courbe->attach(myPlot);
    	//courbe rouge
    courbe->setPen(QPen(Qt::red));
    	//style de la courbe : marches
    courbe->setStyle(QwtPlotCurve::Steps);
    	//définit l'axe x de l'echelle
    myPlot->setAxisScale(QwtPlot::xBottom,min,max);
    }
    void page_visualisation1::creer_menu()
    {
    	//création du menu
    	// Création du menuBar 
    menubar = new QMenuBar(this);
     
      // Création d'un menu déroulant "Fichier"
    menuFichier = new QMenu( " Fichier " );
     
      // et ajout du menu fichier à la barre de menu principale
    menubar->addMenu(menuFichier);
     
      // Maintenant, on ajoute nos items
      // Ajout d'un nouvel item "Changer" que l'on connecte à la fonction changer()
    menuFichier->addAction( " Nouvelle echelle de temps ",this, SLOT(changer_echelle_temps()));
     
      // Ajout d'un séparateur
    menuFichier->addSeparator();
     
      // Ajout d'un item "Quitter" que l'on connecte au slot "close" de la mainWindows
    menuFichier->addAction( "Fermer l'application",this,SLOT(close()) );
     
     //menubar->setStyle(SP_MessageBoxQuestion);
    	// Puis on affecte cette barre de menu à la fenêtre principale
    layout->setMenuBar(menubar);
    }
    void page_visualisation1::creation_page(int echelle)
    {
    pas_scale=echelle;
    max = pas_scale;
    clean=((taille_data*pas_scale*1000)/(time));
     
    	//met un titre sur la page et créé une surface ou tracée la courbe
    QString titre("Variable X");
    myPlot = new QwtPlot(titre);
     
    	//créé un layout et intègre les éléments 
    layout = new QHBoxLayout(this);
    layout->addWidget(myPlot);
     
    creer_menu();
    creer_courbe();
     
    myPlot->setMargin(3);
    QString titre_axe_x("Temps en seconde");
    myPlot->setAxisTitle(2,titre_axe_x);
     
    QString titre_axe_y("Valeur du modèle");
    myPlot->setAxisTitle(0,titre_axe_y);
     
    QColor couleur1 = QColor(190,240,240,50);
    myPlot->setCanvasBackground(couleur1);
     
    	//dimmenssionne et affiche la page
    resize(600,300);
    show();
     
    base_temps();
    }
    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. affichage statistique "dynamique"
    Par nezdeboeuf62 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/04/2007, 14h05
  2. probléme affichage images dynamiques
    Par abdelfettah2007 dans le forum Langage
    Réponses: 1
    Dernier message: 15/03/2007, 00h20
  3. [FLASH MX2004] Pb d'affichage texte dynamique
    Par mohican13 dans le forum Flash
    Réponses: 6
    Dernier message: 01/02/2005, 09h55
  4. [FLASH MX 2004] Affichage texte dynamique
    Par Sun3clipse dans le forum Flash
    Réponses: 8
    Dernier message: 25/06/2004, 16h24
  5. Affichage courbe wav
    Par FredericB dans le forum C++Builder
    Réponses: 9
    Dernier message: 25/05/2004, 15h47

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