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 :

QTableWidgetItem non visible dans un QTableWidget ?

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Front
    Inscrit en
    Décembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Front
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 59
    Par défaut QTableWidgetItem non visible dans un QTableWidget ?
    Bonjour les coupains!
    Voilà, je viens réclamer votre aide suite à un petit pépin sur un programme pour mon boulot. J'ai une BDD stockée dans un objet avec plusieurs listes en attribut, et mon but est de compter les données par type... Par exemple, compter les données qui sont du matériel électrique et qui sont sous la responsabilité de l'entité "pôle 3". (La BDD est fonctionnelle)
    Ensuite, en affichage, je voudrais avoir un système de tabs, avec, dans chaque onglet, un tableau permettant de voir toutes les concordances du type expliqué ci-dessus. Prennons juste l'exemple d'un seul onglet.
    Je crée mon tableau, je crée une liste de QTableWidgetItem à 2D, je leur attribue la valeur kivabien, et après je met chaque QTableWidgetItem dans la cellule du tableau kivabien.
    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
    //Toute la première partie fonctionne. Testée par mes soins.
    //Création des listes de types de données à trier
    QStringList listeTAD(LInventaire->listeTAD());
        listeTAD << "Total";
        QStringList listeCrit;
        listeCrit << "Criticité 0" << "Criticité 1" << "Criticité 2" << "Criticité 3" << "Criticité 4" << "Total";
    //Création des headers
        QHeaderView *HGHeader = new QHeaderView(Qt::Horizontal);
        QHeaderView *VGHeader = new QHeaderView(Qt::Vertical);
        HGHeader->setSectionResizeMode(QHeaderView::ResizeToContents);
        VGHeader->setSectionResizeMode(QHeaderView::ResizeToContents);
        HGHeader->setStretchLastSection(true);
        VGHeader->setStretchLastSection(true);
    //Création du tableau
        QTableWidget *OngletGQTW = new QTableWidget((listeTAD.size()),6, 0);
        OngletGQTW->setHorizontalHeader(HGHeader);
        OngletGQTW->setVerticalHeader(VGHeader);
        OngletGQTW->setHorizontalHeaderLabels(listeCrit);
        OngletGQTW->setVerticalHeaderLabels(listeTAD);
        OngletGQTW->setFixedSize(550,300);
     
    //A partir de là, je ne sais pas trop....
    //Création du tableau de QTableWidgetItem dont les dimensions s'accordent à celles des listes listeTAD et listeCrit (dont sa taille est fixe, 6)
        QTableWidgetItem CellsG[listeTAD.size()][6];
        for (int x = 0; x < listeCrit.size()-1; x++)
        {
            //sommeV permet de calculer le total de la colonne
            int sommeV;
            for (int y = 0; y < listeTAD.size()-1; y++)
            {
                int nbV;
                nbV = LInventaire->countG(listeTAD[y], x);
                sommeV += nbV;
                //Définition du contenu de la cellule
                CellsG[x][y].setData(Qt::DisplayRole, QString::number(nbV));
            }
            //Définition du contenu de la cellule de somme
            CellsG[x][listeTAD.size()-1].setData(Qt::DisplayRole, QString::number(sommeV));
        }
    //Remplissage du tableau
        for (int x = 0; x < listeCrit.size()-1; x++)
        {
            for (int y = 0; y < listeTAD.size()-1; y++)
            {
                OngletGQTW->setItem(x, y, &CellsG[x][y]);
            }
        }
    A savoir que LInventaire est une instance de ma classe Item, et la méthode countG est définie ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int Item::countG(QString critereTAD, int critereCrit)
    {
        int count;
        for (int x = 0; x < this->size(); x++)
        {
            if (((m_tad[x]) == critereTAD) && ((m_criticite[x]) == critereCrit))
                count++;
        }
        return count;
    }
    Autre info: les valeurs de nbV sont de 225.000 environ, alors que je devrai avoir tout au plus 1500... Donc... Les valeurs ne sont pas franchement bonnes non plus ^^'


    Merci par avance!

    Nihi

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    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 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Quel est le problème, précisément ?
    Le titre parle d'un élément non visible, mais vous n'en parlez plus par la suite.
    Dans la discussion, vous signaler une valeur fausse

    Affichez les valeurs nbV successivement et je pense que vous comprendrez mieux l'erreur. (sinon, à l'aide d'un point d'arrêt, dans le débogueur.)
    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 éclairé
    Homme Profil pro
    Développeur Front
    Inscrit en
    Décembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Front
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 59
    Par défaut
    C'est fait, et c'est justement là que je tombe sur ces fameux 220000... Et ce qui est invisible, c'est les QTableWidgetItem que je positionne dans le QTableWidget par la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (int x = 0; x < listeCrit.size()-1; x++)
        {
            for (int y = 0; y < listeTAD.size()-1; y++)
            {
                OngletGQTW->setItem(x, y, &CellsG[x][y]);
            }
        }
    Et les cellules remplies n'apparaissent pas...

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    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 119
    Billets dans le blog
    148
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QTableWidgetItem CellsG[listeTAD.size()][6];
    Fait que les cellules sont détruites à la sortie de la fonction (locales au bloc). Du coup, elles vont disparaitre (ne plus exister).
    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 éclairé
    Homme Profil pro
    Développeur Front
    Inscrit en
    Décembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Front
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 59
    Par défaut
    Je l'ai pourtant mit en attribut, sur le .h associé. Il devrait donc être gardé, non? Ou alors je dois faire un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QTableWidgetItem *CellsG[listeTAD.size()][6] = new QTableWidgetItem ;
    , mais bien syntaxé?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    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 119
    Billets dans le blog
    148
    Par défaut
    Même s'il est en attribut, cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QTableWidgetItem CellsG[listeTAD.size()][6];
    Recouvre et cache l'attribut de même nom de la classe (car elle est du contexte le plus proche).
    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.

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur Front
    Inscrit en
    Décembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Front
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 59
    Par défaut
    Parce que je le redéfinie, c'est ça? Je dois donc shooter "QTableWidgetItem", that's it?

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    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 119
    Billets dans le blog
    148
    Par défaut
    Oui, cela fera que vous utiliserez la variable de classe. En espérant qu'il n'y ai que ça comme problème
    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.

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur Front
    Inscrit en
    Décembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Front
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 59
    Par défaut
    D'accord, donc je marque sur mon petit pense bête que déclarer une variable dans le header est suffisant, sauf si c'est un pointeur et dans ce cas je dois créer la variable ou l'objet avec (type) *nomdevariable = new (type)

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    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 119
    Billets dans le blog
    148
    Par défaut
    Nop.

    Il faut bien comprendre le principe de déclaration et définition.

    Déclaration : indique au compilateur que l'on souhaite une variable d'un type T et qui est visible dans le bloc actuel (soit la fonction, soit la classe, soit en global, pour simplifier).
    Définition : donne une valeur pour la variable (précédemment déclarée).

    La définition s'écrit :
    La déclaration :
    Lorsque l'on est propre, on fait les deux à la fois (car une variable indéfinie est source de bogue, souvent) :
    Lorsque l'on déclare un pointeur, la zone pointée, n'est pas allouée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* pVar; // Un pointeur qui ne point sur rien (== crash lors de l'utilisation)
    Il faut donc lui fournir une zone mémoire sur laquelle pointée :
    Ici, on alloue une zone mémoire pour un int, que l'on initialise à 42.

    Dans votre cas, la déclaration est effectuée dans le .h, car c'est une variable membre de votre classe.

    Le constructeur va se charger de la définir (c'est son rôle d'ailleurs )
    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.

  11. #11
    Membre éclairé
    Homme Profil pro
    Développeur Front
    Inscrit en
    Décembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Front
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 59
    Par défaut
    D'accord, je prend note. J'ai toujours eut du mal avec les pointeurs, mais je comprend, lentement. Merci du coup de patte, je teste ça demain au boulot!

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur Front
    Inscrit en
    Décembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Front
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 59
    Par défaut
    Ca marche, du moins partiellement. Il ne remplie pas toutes les valeurs du tableau. Il commence à faire n'importe quoi à partir de l'index [1][1] de mon tableau de QTableWidgetItem. Tant qu'il est à [1][0] ou [0][x] ça va.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    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 119
    Billets dans le blog
    148
    Par défaut
    Puis-je voir le nouveau code (avec le .h), s'il vous plait.
    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.

  14. #14
    Membre éclairé
    Homme Profil pro
    Développeur Front
    Inscrit en
    Décembre 2013
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Front
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2013
    Messages : 59
    Par défaut
    Je vous envoie le zip entier avec tout le code, ainsi que les 3 fichiers nécessaires à l'exécution.
    Fichiers attachés Fichiers attachés

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    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 119
    Billets dans le blog
    148
    Par défaut
    Désolé pour le retard.

    La liste des include de tadtab.h est trop importance, il n'y a pas besoin de tout cela, ou, pas ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    QLabel *Crit0QL;
    QLabel *Crit1QL;
    QLabel *Crit2QL;
    QLabel *Crit3QL;
    QLabel *Crit4QL;
    Vous pouvez peut être faire un tableau ?

    Le constructeur de mainwindow.cpp est horriblement énorme. Vous pourriez le décomposer en sous fonction, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SuppData(str1);
    SuppData(str1);
    SuppData(str1);
    SuppData(str1);
    SuppData(str1);
    SuppData(str1);
    SuppData(str1);
    SuppData(str1);
    Euh, et pourquoi ne pas utiliser une boucle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    QTableWidgetItem Cells3[listeTAD.size()][6];
        for (int x = 0; x < listeCrit.size()-1; x++)
        {
            int sommeV;
            for (int y = 0; y < listeTAD.size()-1; y++)
            {
                int nbV;
                nbV = LInventaire->count(listeTAD[y], x, 3);
                sommeV += nbV;
                Cells3[x][y].setText(QString::number(nbV));
                }
            Cells3[x][listeTAD.size()-1].setText(QString::number(sommeV));
        }
    Ceci (et surtout la première ligne) redéfini une variable Cells3 (il existe déjà une variable de classe appelée Cells3, mais elle sera cacher par cette nouvelle variable). Du coup, vous remplissez une variable temporaire, qui sera supprimé au '}' fermant le constructeur. Cela est surement un bogue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int countG(QString critereTAD, int critereCrit);
    Afin d'éviter une copie, il faut utiliser une référence pour le paramètre QString (et tout autre paramètre qui n'est pas un type du langage). Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int countG(const QString& critereTAD, int critereCrit);
    Voir :
    http://cpp.developpez.com/faq/cpp/?p...TION_reference
    http://cpp.developpez.com/faq/cpp/?p...CE_utilisation
    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. bmp non visible dans un bouton avec texte
    Par CAMIC dans le forum Windows
    Réponses: 8
    Dernier message: 27/03/2007, 10h24
  2. Réponses: 8
    Dernier message: 04/01/2007, 10h15
  3. Redirection URL Non visible dans la barre d'adresse
    Par domileg dans le forum Langage
    Réponses: 5
    Dernier message: 04/08/2006, 09h02
  4. Composants non visible dans certaines applications
    Par chtom dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 22/03/2006, 17h33
  5. Réponses: 2
    Dernier message: 12/01/2006, 14h54

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