alors, j'ai une classe, avec son constructeur
paramligts::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
# A priori
Posté par idiotduvillage . Évalué à 1.
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 F (site web personnel) . Évalué à 1.
[^] # Re: A priori
Posté par farib . Évalué à 2.
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.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.