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:
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" :mouarf:). 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:
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:
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.