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 :

Problème de QLayout et QWidget

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Par défaut Problème de QLayout et QWidget
    Bonjour a tous, je vais essayer d'exposer mon problème avec le plus de simplicité possible.

    Je dois afficher une liste de structures (définissant une donnée). La donnée est définit par (sans les types) :
    - Un nom
    - Une valeur
    - Une unité

    J'ai pris l'initiative de prendre comme Widget d'affichage une QTableWidget (car ne connaissant pas le nombre de structures dans la liste) avec 3 colonnes.
    Donc en (TRES) gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void updateData(listDeDonnee list)
    {
            iteratorDeMaList it = list.begin();
            while (it != list.end())
            {
                    this->table->ajouterUneLigne();
                    this->table->setItem(0, it->nom);
                    this->table->setItem(1, it->valeur);
                    this->table->setItem(2, it->unity);
                    it++;
            }
    }
    Comme seule la valeur peut etre changee par l'utilisateur, j'ai mis la premiere et la derniere colonne en read only.
    Puis le boss est arrivé et m'a clairement fais savoir qu'il ne voulait pas du tout cela ("Je vais te tuer" -> "Oui chef" ). Il veut les noms dans des QLabel, les valeurs dans des QLineEdit et les unités aussi dans des QLabel.)

    Donc j'en suis à la :
    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
    Constructeur(listDeDonnee list)
    {
            this->_content = new QWidget(this); // widget central
            this->_allign = new QGridLayout(); // layout principal
            this->_labels = new QVector<QLabel*>(); // tableau de QLabel des noms
            this->_datas = new QVector<QLineEdit*>(); // tableau de QLineEdit des valeurs
            this->_unities = new QVector<QLabel*>(); // tableau de QLabel des unites
            this->updateData(list)
    }
     
    void    updateData(listDeDonnee list)
    {
            this->_labels->resize(list.size());
            this->_datas->resize(list.size());
            this->_unities->resize(list.size());
     
            unsigned int  i = 0;
            iteratorDeMaList it = list.begin();
            while (it != list.end())
            {
                    (*this->_labels)[i] = new QLabel(it->nom);
                    (*this->_datas)[i] = new QLineEdit(it->valeur);
                    (*this->_unities)[i] = new QLabel(it->unity);
                    this->_allign->addWidget((*this->_labels)[i], i, 0);
                    this->_allign->addWidget((*this->_datas)[i], i, 1);
                    this->_allign->addWidget((*this->_unities)[i], i, 2);
                    it++;
                    i++;
            }
            this->_content->setLayout(this->_allign);
            this->setCentralWidget(this->_content);
    }
    Cela marche mais lorsque l'utilisateur modifie la liste (en supprimant des maillons par exemple) je dois netoyer le QLayout (malheureusement la methode clear n'existe pas) et appeler la methode updateData donc j'ai essayé de faire cela pour que le QLayout soit clean :
    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
    void    clearLayout(listDeDonnee list)
    {
      unsigned int  i = 0;
     
      while (i < list.size())
        {
          this->_allign->removeWidget(this->_labels->at(i));
          this->_allign->removeWidget(this->_datas->at(i));
          this->_allign->removeWidget(this->_unities->at(i));
          i++;
        }
      this->_allign->update(); // J'ai essaye
      this->_labels->clear();
      this->_datas->clear();
      this->_unities->clear();
    }
    Mais lorsque la liste est modifiée et que updateDate s'exécute on voit que le layout nest pas vide lorque la nouvelle liste est affichée (surtout quand la nouvell est plus grande que l'ancienne car il y a labels et linedit en plus) car les labels et les linedits se superposent (en plus..)

    Si quelqu'un aurait une idée je suis preneur. J'en ai marre de cette methode crade j'ai qu'une envie c'est de finir avec cette partie et passer a autre chose.

    Merci d'avance.

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 91
    Par défaut
    OK j'ai changé la méthode clearLayout par :

    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    clearLayout(listDeDonnee list)
    {
      QLayoutItem *child;
      while ((child = this->_allign->takeAt(0)) != 0)
      {
        delete child->widget;
        delete child;
      }
      this->_allign->update(); // J'ai essaye
      this->_content->update();
      this->_content->repaint();
      this->_labels->clear();
      this->_datas->clear();
      this->_unities->clear();
    }
    Et cela fonctionne.. Je pensais faire la même chose..

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/05/2013, 18h27
  2. Ajouter plusieurs QLayout à un QWidget
    Par Invité dans le forum Qt
    Réponses: 3
    Dernier message: 24/06/2012, 18h48
  3. Problème d'héritage de QWidget
    Par squallmrs dans le forum Qt
    Réponses: 3
    Dernier message: 11/10/2010, 02h38
  4. QWidget dans QLayout
    Par LinuxUser dans le forum Qt
    Réponses: 5
    Dernier message: 16/04/2010, 15h36
  5. Problème : ouverture tardive d'un qwidget
    Par qhardy dans le forum Qt
    Réponses: 0
    Dernier message: 02/04/2010, 15h21

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