Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher une courbe dans Qt en temps réel

    12 août 2019 à 18:07:09

    Bonjour à tous,

    Je cherche à afficher une courbe en temps réel dans Qt.

    Donc j'arrive bien à afficher une courbe mais après avoir fait l'acquisition de mes données alors que je voudrais afficher, quasiment en même temps que je fais une acquisition.

    Voici mon code :

    QtCharts::QLineSeries* series = new QtCharts::QLineSeries();
    	std::map<double,double>::iterator it;
    	for (it = d->GetDigitizer()->GetSignal().begin();  it != d->GetDigitizer()->GetSignal().end(); it++)
    		series->append(it->first, it->second);
    	
    
    	QtCharts::QChart* chart = new QtCharts::QChart();
    	chart->legend()->hide();
    	chart->addSeries(series);
    	chart->createDefaultAxes();
    	chart->setTitle("Signal");
    
    	QtCharts::QChartView* chartView = new QtCharts::QChartView(chart);
    	chartView->setRenderHint(QPainter::Antialiasing);
    
    	ui.gridSignal->addWidget(chartView);



    Une idée de comment on fait ça?

    -
    Edité par ThugYo 12 août 2019 à 18:09:56

    • Partager sur Facebook
    • Partager sur Twitter
      13 août 2019 à 9:18:49

      Salut,

      Autant le dire tout de suite: je n'ai jamais utilisé ni les QCharts ni les capteurs, donc, ce qui suit ne pourra être que tout à fait théorique ;)

      Mais, de manière générale, le principe sera toujours le même : Lorsque tu reçois les données de ton capteur (sans doute au niveau de ce qui est renvoyé par d->GetDigitizer(), dont j'ignore le type), au lieu de mettre ces données dans une map comme tu semble le faire, tu devrait faire émettre un signal capable d'émettre les deux valeurs (celles qui correspondent respectivement à la clé et à la valeur que tu rajoute à la map).

      D'un autre coté, au lieu de créer une variable locale sur ton QLineSeries, tu devrais créer une donnée membre de ce type dans ta classe (de manière à pouvoir y accéder "depuis n'importe où" ), ce qui te permettrait de créer un slot proche de

      void onDataAquired(double x, double y);

      dont l'implémentation serait proche de

      //remplace MyWidget par le type réel de ta classe
      void MyWidget::onDataAquiered(double x, double y){
          series->append(x, y);
      }

      et que tu pourrais connecter au signal émis, sans doute sous une forme proche de

      /* remplace - MySensor par le type de capteur,
       *          - sigDataAquired par le signal effectivement émis
       *          - MyWidget par le nom réel de ta classe et
       *          - dataAquired par le nom réel du slot 
       */
      connect(d->GetDigitizer(), &MySensor::sigDataAquired, series, &MyWidget::dataAquired);

      De cette manière, chaque fois que les données auront été extraites, le signal sera émis, ce qui activera le slot, et un point sera ajouté à ta ligne ;)

      • Partager sur Facebook
      • Partager sur Twitter
      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
        13 août 2019 à 16:16:29

        Bonjour,

        Merci pour la méthode. J'ai deux/trois questions :)

        J'ai essayé de faire un slot du style :

        void Soft::updateGraphView(double tmp, double voltage)
        {
        	dataSeries->append(tmp,voltage);
        	QtCharts::QChart* chart = new QtCharts::QChart();
        	chart->legend()->hide();
        	chart->addSeries(dataSeries);
        	chart->createDefaultAxes();
        	chart->setTitle("Signal");
        
        	QtCharts::QChartView* chartView = new QtCharts::QChartView(chart);
        	chartView->setRenderHint(QPainter::Antialiasing);
        
        	ui.gridSignal->addWidget(chartView);*/
        }

        Bon bah autant vous dire que ça ne fonctionne pas. J'ai créé autant de graphique que j'ai de points ^^

        Du coup, j'ai essayé autre chose, à savoir, juste ajouter des points en faisant :

        dataSeries->append(tmp, voltage);
        
        chart->legend()->hide();
        chart->addSeries(dataSeries); chart->createDefaultAxes(); chart->setTitle("Signal"); chart->setAnimationOptions(QtCharts::QChart::SeriesAnimations);

        Sauf que là, j'ai un message qui me dit "Can not add series. Series already on the chart"

        Donc je vois pas trop comment faire pour afficher point par point...


        -
        Edité par ThugYo 13 août 2019 à 16:16:40

        • Partager sur Facebook
        • Partager sur Twitter
          13 août 2019 à 18:49:21

          Pourrais-on voir le code complet de ta classe Soft (qui semble être celle qui contiendra ta courbe) et celui de la classe renvoyée par d->GetDigitizer()  (fichier d'en-tête + fichier d'implémentation complet)?

          Car, la première règle en informatique lorsque l'on veut obtenir de l'aide efficace, c'est "aide nous à t'aider" .  Si l'on n'a pas toutes les informations qui nous permettent de faire le lien entre les différents problèmes qui peuvent se poser, on travaille en aveugle, et on en devient incapable de t'orienter correctement ;)

          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            14 août 2019 à 16:40:37

            Bonjour,

            J'ai résolu mon problème en faisant autrement.

            Plutôt que d'afficher point par point, j'affiche par segment de plusieurs points, sans oublier de faire :

            chart->removeAllSeries();

            avant d'ajouter une nouvelle série de point!

            En tout cas, merci pour la méthodo :)

            Et je prends note de la réponse ci-dessus pour les prochaines fois :)

            A+

            • Partager sur Facebook
            • Partager sur Twitter

            Afficher une courbe dans Qt en temps réel

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown