Помните, что мы находимся в ОО земле, поэтому мы работаем с объектами.
Чтобы подключить сигнал к чему-либо, эти сигналы / слоты должны быть отделены от объекта.
Еще один способ думать об этом - вы не можете иметь сигнал сам по себе, потому что сигнал должен исходить откуда-то.Точно так же вы не можете иметь слот сам по себе, он должен быть прикреплен к чему-либо.
Теперь Qt позволяет вам подключать сигнал к слоту, но он также позволяет вам подключать сигнал к сигналу , который происходит во второй соединительной линии.Это позволяет вам связывать сигналы от одного объекта к другому, или вы можете думать об этом как , пропуская сигнал через .
Обычно это происходит, когда у объекта или виджета есть частный внутренний дочерний элемент, который излучает сигнал, и родительский объект / виджет хочет испускать сигнал того же тому, кто бы нислушает его.
В вашем примере, виджет LCDRange содержит слайдер, который является внутренней деталью реализации.Пользователю LCDRange не нужно знать обо всех различных компонентах, составляющих LCDRange (слайдер, lcdnumber, макет и т. Д.), Это основное требование инкапсуляции, которое является огромным преимуществом ОО.
Однако пользователь LCDRange захочет узнать, когда значение LCDRange изменится.И вместо того, чтобы создать слот в LCDRange, который просто повторно генерирует сигнал valueChanged, вы можете forward или passthrough valueChanged сигнала с ползунка.
Последовательность обеспечивает тот же эффект прохождения сигнала, но требует гораздо больше кода.
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 );
}