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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 *)));

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

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