qt中连接之间的差异

时间:2010-07-15 20:45:32

标签: qt qt-creator

我有一个类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 个答案:

答案 0 :(得分:1)

请记住,我们在OO土地上,所以我们正在操作物体。

为了将信号连接到某物,这些信号/槽必须是物体的一部分。

考虑它的另一种方法是你不能自己发出信号,因为信号必须来自某个地方。同样地,你不能单独拥有一个插槽,它必须附加到某个东西上。

现在,Qt允许您将信号连接到插槽,但它也允许您将信号连接到信号,这是第二条连接线中发生的情况。这允许您将信号从一个对象链接到另一个对象,或者您可以将其视为通过传递信号。

通常当Object或Widget有一个发出信号的私有内部子项时,会发生这种情况,并且父Object / Widget想要将相同的信号发送给任何人听着它。

在您的示例中,LCDRange小部件包含一个滑块,这是一个内部实现细节。 LCDRange的用户不需要知道构成LCDRange的所有不同组件(滑块,lcdnumber,布局等),这是封装的基本要求,这是OO的一个巨大优势。

然而,LCDRange的用户会想知道LCDRange的值何时发生变化。而不是在LCDRange中创建一个插槽,只需重新发出信号valueChanged信号,就可以转发直通来自滑块的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 );
}

答案 1 :(得分:0)

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

告诉我,如果滑块的值发生变化,那么valueChanged信号将为emited,它将反映在LCD视图中。即调用display个插槽,其实现将出现在QLCDNumber

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

Qt提供了将一个信号连接到另一个信号的机制,它意味着如果发出slider valueChanged信号意味着发出当前类valueChanged信号。 调用valueChanged的连接槽