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

Discussion :

QScrollArea (problème de pointeurs ?)

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 32
    Par défaut QScrollArea (problème de pointeurs ?)
    Bonjour,

    J'ai un petit problème avec un QScrollArea.
    Sur le côté de mon application, j'ai un QTreeView où tous les fichiers audio qu'a ouvert l'utilisateur sont listés. Lorsqu'il click sur un nom de fichier je charge le graph (un qwtplot) correspondant dans le QScrollArea. Les graphs sont créés quand l'utilisateur ouvre les fichiers et sont stockés dans une liste (graphs). Jusque là tout va bien.
    Par contre, quand l'utilisateur reclick sur un nom de fichier qui a déjà été affiché, mon programme plante.

    Je sais pas si c'était bien clair.

    Voici mes codes:
    Méthode pour changer le graph (les left et right sliders sont pour créer des qwtplotmarker sur le graph)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void MainWindow::changeGraph(int index){
     
        int max=graphs[index].getMaxLegend();
        ui->scrollArea->setWidget(graphs[index].getWaveForm());
     
        ui->leftSlider->setMaximum(max);
        ui->leftSlider->setValue(0);
        ui->leftSlider->setToolTip("0");
        ui->rightSlider->setMaximum(max);
        ui->rightSlider->setValue(graphs[index].getFrames());
        ui->rightSlider->setToolTip(QString::number(graphs[index].getFrames()));
    }
    Le constructeur de graph (waveform est le qwtplot que je mets en champs privée pour pouvoir le récupérer et le mettre dans le scrollarea)
    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
     
    Graph::Graph( const string & path )
    {
        SF_INFO fileInfos;
        SNDFILE* audFile = sf_open(path.c_str(), SFM_READ, &fileInfos);
     
        // stock point to draw
        QVector<QPointF> v;
     
        // stock current frame
        double currentFrame[2];
     
        // go to start of data
        sf_seek(audFile,0,SEEK_SET);
     
        // readings frames
        for (sf_count_t i=0;i<fileInfos.frames;i++){
            // reading frame i
            sf_read_double(audFile,currentFrame,fileInfos.channels);
     
            // stock frame points
            v.append(QPointF(i,currentFrame[0]));
            v.append(QPointF(i, fileInfos.channels == 1?0:currentFrame[1]));
        }
     
        // create plot
        string fileName=path.substr(path.find_last_of("/\\")+1);
        QwtPlot* mp = new QwtPlot( QwtText("WaveForm - "+ QString::fromStdString(fileName)));
        mp->setWindowTitle( mp->title().text() );
     
        // create curve
        QwtPlotCurve* c = new QwtPlotCurve(QString::fromStdString(fileName));
     
        // set curve datas
        c->setSamples(QPolygonF(v));
     
        // attache curve to plot
        c->attach(mp);
     
        //create the markers
        leftMarker = new QwtPlotMarker();
        leftMarker->setLineStyle(QwtPlotMarker::VLine);
        leftMarker->setLinePen(QPen(Qt::red));
        leftMarker->setLabel(QString::fromUtf8("Beginning"));
        leftMarker->setLabelAlignment(Qt::AlignRight|Qt::AlignTop);
        leftMarker->setXValue(0);
        rightMarker = new QwtPlotMarker();
        rightMarker->setLineStyle(QwtPlotMarker::VLine);
        rightMarker->setLinePen(QPen(Qt::red));
        rightMarker->setLabel(QString::fromUtf8("End"));
        rightMarker->setLabelAlignment(Qt::AlignLeft|Qt::AlignTop);
        rightMarker->setXValue(fileInfos.frames);
        leftMarker->attach(mp);
        rightMarker->attach(mp);
     
        // replot
        mp->replot();
     
        // return plot
        waveForm= mp;
        frames=fileInfos.frames;
        sf_close(audFile);
    }
    J'imagine que je fais un micmac avec les pointeurs, mais je ne vois pas où.

    Merci d'avance
    Olivier

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    À l'aide d'un debuggueur et d'un execution du code présenté, en mode pas à pas, vous devriez pouvoir debugguer rapidement l'application.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SNDFILE* audFile = sf_open(path.c_str(), SFM_READ, &fileInfos);
    Si cette fonction échoue, vous ne le saurez jamais ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 32
    Par défaut
    Ah oui, j'ai oublié de mettre une exception pour cette instruction.

    Je viens de tester mon programme avec le débuggueur et quand j'arrive à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ui->scrollArea->setWidget(graphs[index].getWaveForm());
    de ma méthode changeGraph, j'arrive sur sur qwt_scale_div.h à la méthode suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /*!
      \return upper bound
      \sa lowerBound()
    */
    inline double QwtScaleDiv::upperBound() const
    {
        return d_upperBound;
    }
    et le message suivant apparaît:
    "L'inférieur a stoppé car il a reçu un signal du système d'exploitation
    Nom du signal: SIGSEGV
    Signification du signal: Segmentation fault"

    Je ne vois pas ce que c'est. Et ce que je ne comprend pas c'est que mon pointeur est stocké dans ma liste, je peux y accéder une première fois et pourquoi pas une deuxième ?

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Hum, soit graph est à NULL (0)
    Soit index est à une valeur plus grande que la taille de graph. Mais avec le debuggueur c'est facile à voir, en affichant les valeurs des variables.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 32
    Par défaut
    mon index est bon, par contre la valeur que retourne getWaveForm() est "<not accessible>" j'imagine que c'est null.

    Bon ok donc le getWaveForm retourne null quand on essaye de récupérer le même pointeur une deuxième fois.

    Mais pourquoi ?

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Citation Envoyé par olivier.a Voir le message
    Mais pourquoi ?
    Ah bah ça ... c'est un peu votre code, vous êtes sensé savoir ce qu'il fait ... et donc avoir des pistes ...
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Problème de pointeurs..embrouillé
    Par Frenchy dans le forum C++
    Réponses: 11
    Dernier message: 10/03/2005, 16h33
  2. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57
  3. Problème de pointeur
    Par toma_lille dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2004, 21h26
  4. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50
  5. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39

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