Retourner aux forums || Retourner au forum Programmation.c++

Programmation.c++ : Qt me joue des tours

Posté par farib () le 18 juillet 2004
0
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

> Lire le message (3 commentaires, moyenne: 1,3).  

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.

A priori

Posté par idiotduvillage () le 18/07/2004 à 13:49. (lien). Évalué à 1.

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++