Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Affichage de graphique

Sujet résolu
    30 janvier 2019 à 20:21:55

    Bonjour tout le monde, je viens vers vous aujourd'hui car il se passe quelque chose d'assez intriguant sur mon code et on n'arrive pas à comprendre pourquoi avec mon coloc.

    Un peu de contexte, j'ai un document texte qui commence par quelques lignes de blabla toutes précédées du caractère '%', j'ai ensuite plus de 3000 lignes des valeurs d'une centrale inertielle avec 12 colonnes de chiffres. Mon code est censé lire le fichier, récupérer les infos des deux premières colonnes et tracer les valeurs de la deuxième colonnes en fonction du temps (la première colonne).

    La récupération de mes données se passe bien, le tracé se passe bien, et je décide d'aérer le code en écrivant une fonction Affichage pour y ranger toute la création des Charts, l'ajout des couples de valeurs dans un QLinesSeries et l'affichage de la courbe. Le problème est que quand j'utilise ma fonction (qui est le copié collé de ce qui fonctionne si j'écris tout dans le main à deux noms de variable prêt) mon code compile, ouvre une fenêtre et la ferme dans la foulée ! Je n'arrive pas à comprendre pourquoi. Je vous joins ci dessous mon code source dans lequel se trouve à la fois la fonction qui ne marche pas (l'appel de la fonction en fin de programme est mis en commentaire) et l'équivalent de la fonction rédigé dans le main. Si quelqu'un a une explication j'en serais ravis merci d'avance !

    #include "mainwindow.h"
    #include <iostream>
    #include <QApplication>
    #include <QFile>
    #include <QTextStream>
    #include <QDebug>
    #include <QVector>
    #include <QtCharts/QChartView>
    #include <QtCharts/QLineSeries>
    
    QT_CHARTS_USE_NAMESPACE
    
    void affichage(QVector<double> &temps,QVector<double> &valeur)
    {
        QLineSeries *series = new QLineSeries();
    
        for (int i=0;i<temps.length();i++)
            series->append(temps[i],valeur[i]);      // Ajoute tous les couples de points dans le QLineSeries
        QChart *chart = new QChart();
        chart->legend()->hide();
        chart->addSeries(series);
        chart->createDefaultAxes();
        chart->setTitle("Simple line chart example");
        chart->setAnimationOptions(QChart::AllAnimations);
    
        QChartView *chartView = new QChartView(chart);
        chartView->setRenderHint(QPainter::Antialiasing);
        QMainWindow window;
        window.setCentralWidget(chartView);
        window.resize(400, 300);
        window.show();
    }
    
    int main(int argc, char **argv)
    {
        QApplication a(argc, argv);
    
        QVector<double> tab_temps;  // Tableau dynamique pour stocker toutes les valeurs de temps de la centrale inertielle
        QVector<double> tab_x;   // Tableau dynamique pour stocker toutes les valeurs de X de la centrale inertielle    
    
        QFile fichier("D:\\C++\\QT\\Lecture_fichier\\centrale.txt");   // Il faut changer cette ligne avec le bon répertoire du fichier
    
        if(fichier.open(QIODevice::ReadOnly | QIODevice::Text))  //On test la bonne ouverture du fichier
        {
            QString ligne;
            QTextStream flux(&fichier);
    
    
            while(!flux.atEnd())       // On lit le document jusqu'à la fin
            {
                ligne=flux.readLine()+'\n';
                if (ligne[0]!='%')              //On ne travaille que sur les lignes avec des nombres, celles qui commencent par % ne sont pas traitées
                {
                    int i=0;
                    QString time_value="";      // QString qui stockera le premier nombre de la liste qui correspond à la variable temps
                    while(ligne[i]!='\t')       // Tant qu'on lit pas un "tab"
                    {
                        time_value+=ligne[i];   // On ajoute le caractère au QString
                        i++;
                    }
                    tab_temps.push_back(time_value.toDouble());  // Conversion en double et ajout du chiffre de la ligne actuelle au tableau temps
    
                    int j=i+1;                  // On se place après le premeir tab détecté
                    QString x_value="";
                    while(ligne[j]!='\t')       // Même principe qu'avant
                    {
                        x_value+=ligne[j];
                        j++;
                    }
                    tab_x.push_back(x_value.toDouble());
                }
            }
        }
        else
            qDebug()<<"Impossible d'ouvrir le Fichier";   // On informe de la non ouverture
    
    
        //affichage(tab_temps,tab_x);                  // Appel de la fonction affichage (ne marche pas)
    
        QLineSeries *series = new QLineSeries();       // Fonctionne correctement pour plot la courbe
    
        for (int i=0;i<tab_x.length();i++)
            series->append(tab_temps[i],tab_x[i]);
        QChart *chart = new QChart(); 
        chart->legend()->hide();
        chart->addSeries(series);
        chart->createDefaultAxes();
        chart->setTitle("Simple line chart example");
        chart->setAnimationOptions(QChart::AllAnimations);
    
        QChartView *chartView = new QChartView(chart);
        chartView->setRenderHint(QPainter::Antialiasing);
        QMainWindow window;
        window.setCentralWidget(chartView);
        window.resize(400, 300);
        window.show();
    
    
    
        return a.exec();
    }
    
    



    -
    Edité par ThibaultVnt 30 janvier 2019 à 20:23:13

    • Partager sur Facebook
    • Partager sur Twitter
      12 février 2019 à 9:00:16

      Bonjour,

      C'est parce que ta fenêtre (QMainWindow window) est détruite à la fin de ta fonction d'affichage. Puisque cet objet est créé au sein de la fonction elle même et que toute variable ou objet est détruit à la fin du scope dans lequel il est créé, ta fenêtre est détruite et donc disparaît aussitôt être apparue.

      • Partager sur Facebook
      • Partager sur Twitter
      Il y a 10 types de personnes : Ceux qui comprennent le binaire et ceux qui ne le comprennent pas.
        25 février 2019 à 17:22:45

        Merci beaucoup pour cette réponse ! 
        • Partager sur Facebook
        • Partager sur Twitter

        [Qt] Affichage de graphique

        × 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