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 :
Comme seule la valeur peut etre changee par l'utilisateur, j'ai mis la premiere et la derniere colonne en read only.
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++; } }
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 :
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
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); }
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..)
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(); }
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.
Partager