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 :

Récupérer valeur au changement de 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 Récupérer valeur au changement de cellule
    Bonjour,
    J'ai créé un QTableWidget *tableau pour y inscrire des données afin de les traiter après tri.
    Je souhaite que le texte saisi soit centré (et mis en majuscules) si besoin quand on sort d'une cellule.
    Je me sers donc du signal ItemSelectionChanged()
    Je n'ai aucun problème de compilation mais mon appli plante au 1er changement de cellule ("***.exe a rencontré un problème et doit fermer...bla...bla...bla...voulez-vous envoyer...bla...bla...bla").

    Voici mon connect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(tableau, SIGNAL(itemSelectionChanged()), this, SLOT(majuscule()));
    Et l'implémentation du slot :
    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
    void IHM::majuscule()
    {
        QTableWidgetItem *itemActuel = new QTableWidgetItem();
     
        /* la ligne suivante pose problème. Si je la retire mon appli ne plante
        plus mais ma QMessageBox me montre que je ne récupère aucune valeur.*/
        itemActuel = tableau->currentItem();
     
        //la suite
        QString texteAffiche = itemActuel->text();
        itemActuel->setTextAlignment(Qt::AlignHCenter);
        texteAffiche = texteAffiche.toUpper();
        //LaQmessageBox sert pour mes tests bien sûr
        QMessageBox::information(this, "titre", texteAffiche);
    }

    En fait je galère pour utiliser "currentItem". J'ai testé plein de choses depuis hier mais en vain.
    Merci de m'aider.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut,
    pour commencer ca c'est pas bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     QTableWidgetItem *itemActuel = new QTableWidgetItem();
    ca te créé une belle fuite mémoire.

    ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    itemActuel = tableau->currentItem();
    il faut vérifier qu'il t'as bien donné un pointeur. ie que itemActuel !=NULL

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    ce signal ne serait'il pas plus adapté?

    void currentItemChanged ( QTableWidgetItem * current, QTableWidgetItem * previous )

  4. #4
    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,

    +1 pour la dernière remarque de mongaulois.

    Sinon, c'est très mal de ne pas gérer les cas de pointeurs null lorsque cela fait partie de la logique du programme. C'est très probablement ce qu'il se passe ici.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Salut,
    pour commencer ca c'est pas bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     QTableWidgetItem *itemActuel = new QTableWidgetItem();
    ca te créé une belle fuite mémoire.

    ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    itemActuel = tableau->currentItem();
    il faut vérifier qu'il t'as bien donné un pointeur. ie que itemActuel !=NULL

    Pourrais-je avoir des précisions et un exemple d'implémentation car j'avoue que je ne vois pas ce qu'il y a de mal.

    Concernant void currentItemChanged ( QTableWidgetItem * current, QTableWidgetItem * previous ), j'avais regardé ce signal mais je dois passer les mêmes paramètres à mon slot et c'est ce qui m'avait bloqué.
    Mais j'y retourne.

  6. #6
    Membre chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Par défaut
    Dans le premier cas tu alloues en mémoire avec new un nouvel objet QTableWidgetItem, itemActuel pointe dessus. Et juste après tu récupères dans itemActuel l'adresse d'un autre objet, qui normalement correspond à une des cases. A ce moment là tu as perdu l'information concernant la position de l'objet que tu as créé en mémoire, pourtant il existe bel et bien. Donc à chaque fois que tu vas passer dans cette fonction un objet inutile va être créé et abandonné en mémoire.

    Pour le deuxième, Mongaulois te précises que currentItem() te renvoie un pointeur de QTableWidgetItem, qui soit correspond à un vrai objet existant soit est nul (par exemple s'il n'y a pas encore d'item courant). Il faut donc que tu vérifies qu'il est non nul avant d'utiliser l'objet sinon ça plante comme ça le fait pour toi.

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Je voudrais récupérer la valeur de la cellule que l'on quitte mais je n'arrive pas à le faire.

    connect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(tableau, SIGNAL(currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)), this, SLOT(majuscule(QTableWidgetItem *current, QTableWidgetItem *previous)));

    slot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void IHM::majuscule(QTableWidgetItem *current, QTableWidgetItem *previous)
    {
        QString texteAffiche = previous->text();
        previous->setTextAlignment(Qt::AlignHCenter);
        texteAffiche = texteAffiche.toUpper();
     
        //je met une QMessageBox pour vérifier si je récupère bien la valeur
        QMessageBox::information(this, "titre", texteAffiche);
    }

    On n'entre pas dans le slot. D'ailleurs la sortie console du mode debug m'indique un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QObject:: connect : no such signal QTableWidget::currentItemChanged(QTableWidgetItem*current, QTableWidgetItem*previous)

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    en comme ca?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(tableau, SIGNAL(currentItemChanged(QTableWidgetItem *, QTableWidgetItem *)), this, SLOT(majuscule(QTableWidgetItem *, QTableWidgetItem *)));

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Merci j'ai réussi à faire marcher mon slot.
    En revanche j'ai deux questions :

    1) doit-on seulement mettre le type du paramètre dans le connect ?
    2) Comment pourrais-je améliorer mon code pour éviter de créer une variable QString pour le passage en majuscules ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void IHM::majuscule(QTableWidgetItem *current, QTableWidgetItem *previous)
    {
        QString texteAffiche = previous->text();
        texteAffiche = texteAffiche.toUpper();
        previous->setText(texteAffiche);
        previous->setTextAlignment(Qt::AlignHCenter);
    }
    Encore merci.

    EDIT : si je sélectionneplusieurs cellules dont une est déjà remplie, ça bugge.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par jerome71300 Voir le message
    1) doit-on seulement mettre le type du paramètre dans le connect ?
    il me semble oui

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2) Comment pourrais-je améliorer mon code pour éviter de créer une variable QString pour le passage en majuscules ?
    Ne t'embête pas. Elle sera de toute façon créé. Puis les QString utilise le COW( copy on write)
    AU pire tu fait cà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        previous->setText( previous->text().toUpper());
    Mais je trouve ca moins propre.
    Tu devrais tester si tes pointeur sont egale à 0 ou non

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Quels pointeurs ?
    Tester : comment ?

    J'avoue que je suis un peu paumé là...

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par jerome71300 Voir le message
    Quels pointeurs ?
    Tester : comment ?

    J'avoue que je suis un peu paumé là...
    ?????
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void IHM::majuscule(QTableWidgetItem *current, QTableWidgetItem *previous)
    {
        if ( current!= 0) 
        {
            //bla bla bla
        }
        if ( previous != 0) 
        {
            //pasglop pasglop pasglop
        }
    }
    Juste pour remarque, Je n'utilise pas NULL car il n'est pas sensé exister en C++.

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Bon !
    Après plusieurs test voici ce qu'il se passe :
    Le programme plante :
    - lorsque je passe d'une cellule vide à une cellule non vide.
    - lorsque je sélectionne plusieurs cellules dont l'une d'entre elles n'est pas vide.

    Comment résoudre ça ?

    Merci.

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par jerome71300 Voir le message
    Bon !
    Après plusieurs test voici ce qu'il se passe :
    Le programme plante :
    - lorsque je passe d'une cellule vide à une cellule non vide.
    - lorsque je sélectionne plusieurs cellules dont l'une d'entre elles n'est pas vide.

    Comment résoudre ça ?

    Merci.
    up up

  15. #15
    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
    En suivant ce que nous (mongaulois et moi) t'avons dit: vérifie que tes pointeurs soient valide (donc non null). J'ai pas assez d'imagination pour trouver une autre façon de dire.

  16. #16
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    ok !
    J'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (current != 0 && previous == 0)
        {
            QMessageBox::information(this, "Test", "erreur");
        }
    Et j'ai bien une erreur !
    En revanche je ne vois pas comment y remédier.

  17. #17
    Membre chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Par défaut
    Je ne vois rien de problématique à être dans ce cas là.
    Ce qu'il faut c'est que si previous est nul, alors tu ne fais strictement rien. S'il est non nul, il pointe vers une case qui existe et tu peux faire tout ce que tu veux dessus.

  18. #18
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Un très grand merci à vous tous !!!
    Mon algo n'était pas bon du tout en effet.
    Je mets la solution si ça peut servir à quelqu'un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void IHM::majuscule(QTableWidgetItem *current, QTableWidgetItem *previous)
    {
        if ((current == 0) || (current != 0  && !previous == 0))
        {
            QString texteAffiche = previous->text();
            texteAffiche = texteAffiche.toUpper();
            previous->setText(texteAffiche);
            previous->setTextAlignment(Qt::AlignCenter);
        }
    }
    Dernière question toutefois (je sais j'abuse) :
    Je souhaite exécuter certaines opération selon la colonne où on se trouve (ex: une colonne devra formater les données en format horaire, une autre en int...).

  19. #19
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    peut tu m'expliquer ton test???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((current == 0) || (current != 0  && !previous == 0))
    Citation Envoyé par jerome71300 Voir le message
    Je souhaite exécuter certaines opération selon la colonne où on se trouve (ex: une colonne devra formater les données en format horaire, une autre en int...).
    regarde ici.
    http://qt.developpez.com/doc/4.3/mod...w-programming/

  20. #20
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 224
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    peut tu m'expliquer ton test???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((current == 0) || (current != 0  && !previous == 0))
    Le problème apparaît quand ma cellule de départ est vide et (&&) ma cellule d'arrivée ne l'est pas.
    Donc :
    - si la "cellule d'arrivée" est vide (current == 0), c'est bon.
    - si la cellule d'arrivée n'est pas vide (current != 0), il faut que la cellule de départ NE soit PAS vide (previous != 0).
    Dans tous les autres cas, la condition n'est pas vérifiée et donc on ne fait rien.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. récupérer la valeur affichée d'une cellule
    Par DiverSIG dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/01/2008, 09h45
  2. Comment récupérer valeur cellule d'un gridview?
    Par cortex024 dans le forum ASP.NET
    Réponses: 9
    Dernier message: 23/03/2007, 14h31
  3. [VBA-E]Récupérer valeur cellule
    Par wanou44 dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 06/02/2006, 12h52
  4. [POI]Récupérer valeur cellule suivant format
    Par leminipouce dans le forum Documents
    Réponses: 1
    Dernier message: 27/10/2005, 08h52
  5. [vb.net][combobox] récupérer la valeur avant changement
    Par graphicsxp dans le forum Windows Forms
    Réponses: 36
    Dernier message: 19/10/2005, 10h59

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