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 :

QTableWidget écrire dans une autre cellule


Sujet :

Qt

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut QTableWidget écrire dans une autre cellule
    Bonjour,
    J'ai une QTableWidget tableau
    Voici ce que je veux obtenir :

    On saisit une donnée dans la colonne "recette".
    On ouvre un fichier texte et on récupère une chaîne stockée dans QString groupe.
    On affiche groupe dans une autre cellule (même ligne mais autre colonne).

    Voici le code (qui fait partie d'un slot perso dont le prototype est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void traitementSaisies(QTableWidgetItem*, QTableWidgetItem*);
    Il est relié au signal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentItemChanged(QTableWidgetItem*, QTableWidgetItem*)

    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
    if(fichierRecette.isOpen() == true)
                {
                    while (!lectureFichier.atEnd())
                    {
                        recetteLue = lectureFichier.readLine();
                        if (recetteLue == texteAffiche)
                        {
                            groupe = lectureFichier.readLine();
                            nbBU = lectureFichier.readLine();
     
                            previous->setFont(QFont("Microsoft Sans Serif", 8, QFont::Bold));
                            QColor couleurDefault(Qt::black);
                            previous->setForeground(QBrush(couleurDefault));
                            previous->setText(recetteLue);
     
                            /***************************/
                            /*** ICI SE SITUE LE PROBLEME ***/
                            /***************************/
                            tableau->setCurrentCell(tableau->currentRow(), 7);
                            tableau->currentItem()->setText(groupe);
     
                            fichierRecette.close();
                            break;
                        }
                        else if (lectureFichier.atEnd())
                        {
                            QMessageBox::warning(this, "", "<strong><H3>Recette absente.\nVeuillez vérifier votre saisie.</strong></H3>");
                            fichierRecette.close();
                            previous->setFont(QFont("Microsoft Sans Serif", 12, QFont::Bold));
                            QColor couleurErreur (Qt::red);
                            QBrush brushErreur (couleurErreur);
                            previous->setForeground(brushErreur);
                            previous->setText(("Erreur"));
                            previous->setTextAlignment(Qt::AlignCenter);
                        }
                    }
                }
    A l'exécution le programme plante.
    Merci de m'aider.

  2. #2
    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
    Par défaut
    Salut,

    Première chose à faire: trouver la source de l'erreur. Donc arme toi d'un debugger, trouve l'instruction qui plante, et on pourra t'en dire plus à ce moment.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Heu...
    1) J'ai indiqué l'endroit qui pose problème.
    2) Qu'entends-tu par "armes-toi d'un debugger" ?

    Je suppose que le programme accède à une zone mémoire interdite mais je ne vois pas où se situe la source de ce problème.

  4. #4
    Membre chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Par défaut
    Pour le problème j'ai pas regardé mais en tout cas pour le 2), quand on code il vaut mieux avoir à portée de main un debugger qui te permet de savoir qu'elle est l'instruction qui fait planter le tout et quels ont été les derniers appels, entre autres.

  5. #5
    Membre chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Par défaut
    Au passage dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau->currentItem()->setText(groupe);
    currentItem() renvoie un pointeur qui peut être nul et auquel on ne peut alors appliquer setText(). Il faut vérifier que tes pointeurs ne sont pas nuls. Idem plus bas avec previous, qui je pense est le paramètre de ton slot, mais peut-être as tu déjà réalisé le test plus haut.

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    previous->setText() fonctionne sans aucun problème.

    Pour le debugger, j'utilise Code::Blocks.
    Quelles sont les options à activer ?

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Désolé je crois avoir trouvé quelque chose :
    Child process PID: 4072
    Program received signal SIGSEGV, Segmentation fault.
    At C:/Qt/4.3.2/include/QtGui/../../src/gui/itemviews/qtablewidget.h:186

    Ce qui indique bien une adresse mémoire interdite.
    Par contre je ne vois pas comment y remédier.

    EDIT :
    J'ai testé et le pointeur est NULL vu que le code ne s'exécute pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    QTableWidgetItem *itemGroupe = new QTableWidgetItem();
                            itemGroupe = tableau->currentItem();
     
                            if (itemGroupe !=  NULL)
                            {
                                QMessageBox::information(this, "", "TEST");
                                tableau->setCurrentCell(tableau->currentRow(), 7);
                                itemGroupe->setText(groupe);
                            }

    Mais je bloque toujours.
    Je suis sûr que c'est tout bête pourtant.

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    C'est encore moi :

    J'utilisais la mauvaise méthode. Je n'avais pas vu setItem();

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QTableWidgetItem *itemGroupe = new QTableWidgetItem();
    itemGroupe->setText(groupe);
    tableau->setItem(previous->row(), 7, itemGroupe);

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hio,
    Citation Envoyé par jerome71300 Voir le message
    ...
    EDIT :
    J'ai testé et le pointeur est NULL vu que le code ne s'exécute pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //==============================================
    QTableWidgetItem *itemGroupe = new QTableWidgetItem();
                            itemGroupe = tableau->currentItem();
    //==============================================
     
                            if (itemGroupe !=  NULL)
                            {
                                QMessageBox::information(this, "", "TEST");
                                tableau->setCurrentCell(tableau->currentRow(), 7);
                                itemGroupe->setText(groupe);
                            }
    Pas trop le temps de regarder en détail, mais attention : avec les 2 lignes que j'ai séparées par des
    //==============================================
    dans le code, jolie fuite mémoire : un nouvel objet créé, et le pointeur qui pointe dessus est immédiatement écrasé.

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

Discussions similaires

  1. écrire dans une autre langue chinois et arabe
    Par pottiez dans le forum C++Builder
    Réponses: 0
    Dernier message: 29/07/2008, 14h17
  2. Inscrit l'adresse d'une cellule sélectionnée dans une autre cellule
    Par Bubale dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/05/2008, 22h26
  3. Copier une cellule dans une autre cellule
    Par zis0907 dans le forum Excel
    Réponses: 1
    Dernier message: 24/04/2008, 18h24
  4. Recupere la valeur d'une ComboBox dans une autre cellule
    Par Henricoo dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 01/06/2007, 13h56
  5. [HTML] click lien sur une cellule et page qui s'ouvre dans une autre cellule
    Par mariogarcia dans le forum Balisage (X)HTML et validation W3C
    Réponses: 26
    Dernier message: 24/05/2006, 14h37

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