Разница между соединениями в QT - PullRequest
0 голосов
/ 16 июля 2010

У меня есть конструктор для класса LCDRange:

 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);
 }

, но я не могу понять разницу между этими строками:

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

заранее спасибо

Ответы [ 2 ]

1 голос
/ 16 июля 2010

Помните, что мы находимся в ОО земле, поэтому мы работаем с объектами.

Чтобы подключить сигнал к чему-либо, эти сигналы / слоты должны быть отделены от объекта.

Еще один способ думать об этом - вы не можете иметь сигнал сам по себе, потому что сигнал должен исходить откуда-то.Точно так же вы не можете иметь слот сам по себе, он должен быть прикреплен к чему-либо.

Теперь 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 );
}
0 голосов
/ 16 июля 2010
connect(slider, SIGNAL(valueChanged(int)),
                 lcd, SLOT(display(int)));

сообщает, что если значение ползунка будет изменено, то сигнал valueChanged будет emited, и это будет отражено на ЖК-дисплее.то есть вызывается display slots, реализация которого будет присутствовать в предложениях QLCDNumber

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

Qt, механизм соединения одного сигнала с другим сигналом, это подразумевает, если сигнал slider valueChanged испускаетсяозначает, что присутствует сигнал класса valueChanged.подключенный слот для valueChanged называется

...