Forum Programmation.c++ Qt me joue des tours

Posté par  .
Étiquettes : aucune
0
18
juil.
2004
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  . É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  (site web personnel) . É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  . É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.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.