2010-07-15 7 views
0

J'ai quelques constructeur pour LCDRange classe:différence entre les connexions à qt

LCDRange::LCDRange(QWidget *parent) 
    : QWidget(parent) 
{ 
    QLCDNumber *lcd = new QLCDNumber(2); 
    lcd->setSegmentStyle(QLCDNumber::Filled); 

    slider = new QSlider(Qt::Horizontal); 
    slider->setRange(0, 99); 
    slider->setValue(0); 

    connect(slider, SIGNAL(valueChanged(int)), 
      lcd, SLOT(display(int))); 
    connect(slider, SIGNAL(valueChanged(int)), 
      this, SIGNAL(valueChanged(int))); 

    QVBoxLayout *layout = new QVBoxLayout; 
    layout->addWidget(lcd); 
    layout->addWidget(slider); 
    setLayout(layout); 
} 

mais je ne peux pas comprendre la différence entre ces lignes:

connect(slider, SIGNAL(valueChanged(int)), 
       lcd, SLOT(display(int))); 
connect(slider, SIGNAL(valueChanged(int)), 
       this, SIGNAL(valueChanged(int))); 

merci à l'avance

Répondre

1

Rappelez-vous que nous sommes dans la terre OO, donc nous opérons sur des objets.

Afin de connecter un signal à quelque chose, ces signaux/slots doivent être séparés d'un objet. Une autre façon d'y penser est que vous ne pouvez pas avoir un signal en soi, car un signal doit provenir de quelque part. De même, vous ne pouvez pas avoir un slot tout seul, il doit être attaché à quelque chose. Maintenant, Qt vous permet de connecter un signal à un emplacement, mais il vous permet également de connecter un signal à un signal, ce qui se passe dans la deuxième ligne de connexion. Cela vous permet d'enchaîner les signaux d'un objet à un autre, ou vous pouvez penser à en passant un signal à travers.

Habituellement, cela se produit lorsqu'un objet ou Widget a un enfant privé interne qui émet un signal, et l'objet parent/Widget veut émettre le signal même à celui qui est l'écoute.

Dans le cas de votre exemple, le widget LCDRange contient un curseur, qui est un détail d'implémentation interne. L'utilisateur de LCDRange n'a pas besoin de connaître tous les différents composants qui composent le LCDRange (slider, lcdnumber, layout, etc), c'est une exigence de base de l'encapsulation qui est un énorme avantage de OO.

Cependant, l'utilisateur de LCDRange voudra savoir quand la valeur de LCDRange change. Et plutôt que de créer une fente dans LCDRange, qui réémet simplement le signal de signal valueChanged, vous pouvez transmettre ou passthrough le signal valueChanged du curseur.

Ce qui suit a le même effet que de faire passer le signal, mais il nécessite beaucoup plus de code.

class LCDRange : public QWidget 
{ 
// constructor and other methods 
//... 
signals: 
    void valueChanged(int) 
private slots: 
    void sliderValueChanged(int); 
// ... 
}; 

// in the LCDRange constructor 
connect(slider, SIGNAL(valueChanged(int)), 
       this, SLOT(sliderValueChanged(int))); 

// elsewhere in LCDRange's definition 

void LCDRange::sliderValueChanged(int value) 
{ 
    emit valueChanged(value); 
} 
0
connect(slider, SIGNAL(valueChanged(int)), 
       lcd, SLOT(display(int))); 

tells, si la valeur du curseur se change alors le signal valueChanged sera emited et sera reflété dans la vue LCD. i.e. display fentes est appelée, dont la mise en œuvre sera présent dans QLCDNumber

connect(slider, SIGNAL(valueChanged(int)), 
       this, SIGNAL(valueChanged(int))); 

offres Qt, mécanisme de connexion d'un signal à un autre signal, il implique si le signal slidervalueChanged est emited signifie classe présente le signal valueChanged est emited. l'emplacement connecté pour valueChanged est appelé

Questions connexes