我有一个类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)));
提前致谢
答案 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
的连接槽