Retourner aux forums || Retourner au forum Programmation.c++
Programmation.c++ : Qt me joue des tours
Posté par farib () le 18 juillet 2004paramligts::paramligts(QWidget *parent, const char *name)
: QWidget(parent, name)
{
layout_principal = new QVBoxLayout(this);
layout_secondaire = new QHBoxLayout();
layout_principal->addLayout(layout_secondaire);
description = new QLabel(QString("Nombre de sources lumineuses : "),this);
layout_secondaire->addWidget(description);
numlights = new QSpinBox(0,10,1,this);
numlights->setValue(0);
layout_secondaire->addWidget(numlights);
connect(numlights,SIGNAL(valueChanged(int)),this,SLOT(valueChanged(int)));
GBLights = new QGroupBox(6,Qt::Horizontal,QString("Lumières"),this);
layout_principal->addWidget(GBLights,0,Qt::AlignTop);
lbl_light = new QLabel(QString("Lumière"),GBLights);
lbl_color = new QLabel(QString("Couleur"),GBLights);
lbl_x = new QLabel(QString("X"),GBLights);
lbl_y = new QLabel(QString("Y"),GBLights);
lbl_z = new QLabel(QString("Z"),GBLights);
light_number.setAutoDelete(true);
addlite(12);
addlite(1);
}
et une méthode, connectée
void paramligts::addlite(int newValue)
{
QLabel * tempo = new QLabel(QString("tjjr"),GBLights);
//layout_principal->addWidget(tempo);
light_number.append(tempo);
light_number.current()->setText(QString("drc"));
}
jusqu'ici, rien de bien follichon
le problème est simple :
dans tous les cas, addlite alloue bien sa mémoire
si addlite() est appelé depuis le constructeur, les QLabel qu'il crée sont bien affichés
si addlite() est appelé avec le signal (le signal connecté avec la spinbox), les QLabel ne sont pas affichés ( comme si le fait que le widget avait déja été construit et affiché empechait qu'on lui rajoute des fils)
une idée du pourquoi du comment ?
j'ai beau tester avec variations de resize, repaint, etc.... rien ça s'affiche pas
c'est étonnant d'autant que j'avais déja fait une telle fonction avec des widgets dynamiques et rajoutés, et ça marchait sans broncher
> Lire le message (3 commentaires, moyenne: 1,3).
A priori
Si j'ai bien tout capté, en changeant
le connect(numlights,SIGNAL(valueChanged(int)),this,SLOT(valueChanged(int)));
par
connect(numlights,SIGNAL(valueChanged(int)),this,SLOT(addlite(int)));
puis en ajoutant un simple tempo->show() dans le slot addlite(int), cela devrait suffire :
par exemple, on pourrait avoir
void Paramligts::addlite( int newValue )
{
QLabel* tempo = new QLabel( "", GBLights );
tempo->setText( QString( "N°%1").arg( newValue) );
tempo->show();
}
cela, pour afficher des label N°1, N°2 ... N°10
Si show() est omis, le QLabel est créé, mais pas affiché puisque à priori, la fenêtre est arrangée (layout, positions ...) au premier affichage, les modifications doivent être absolument explicites.
En espérant que c'était le problème ...
-
[^]Re: A priori
Posté par Philippe Fremy (page perso, ) le 19/07/2004 à 07:57. (lien). Évalué à 1.A mon avis, il faut plutot appeler layout_principal->activate() dans ton slot pour forcer le recalcul des tailles des differents widgets.
-
[^]Re: A priori
Posté par farib () le 19/07/2004 à 18:49. (lien). Évalué à 2.Bien vu, c'était le show() qu'il fallait faire pour forcer à réafficher le widget.
Bon en fait j'ai trouvé par moi même, après avoir posté ici, mais avant ta réponse.
Précédemment, lorsque je créais dynamiquement mes Widget, je n'avais pas rencontré ce problème, que je mettais le paramétrage du nombre de sliders et les sliders dans deux tabs différents, ainsi lorsque je changeais de tab pour voir la modification, la fonction show() était implicitement appelée.
Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.c++



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.