Qt如何处理一个看似无限循环的事件触发?

10

我既有一个 QSlider 又有一个 QSpinBox,我希望它们的值始终相等,因此我将滑块的 valueChanged(int) 信号连接到旋转框的 setValue(int) 插槽中,反之亦然:(当然,我还将最小值和最大值设置为相等)

connect(delay_slider, SIGNAL(valueChanged(int)),
        delay_spin, SLOT(setValue(int)));
connect(delay_spin, SIGNAL(valueChanged(int)),
        delay_slider, SLOT(setValue(int)));

我测试了一下,它可以工作(至少在我的Ubuntu 12.04 LTS x86_64,g++ 4.6.3,Qt 4.8.1上)。
现在,我认为当我发出其中一个信号时,它将触发另一个信号,然后触发第一个信号,然后触发另一个信号,以此类推。Qt是如何处理这个的?是否有描述所使用机制的文档?
注意:我称其为“事件发射循环”,因为这与Qt事件循环无关。
1个回答

11

这恰恰是来自Signal & Slots文档的例子:

 Counter a, b;
 QObject::connect(&a, SIGNAL(valueChanged(int)),
                  &b, SLOT(setValue(int)));

 a.setValue(12);     // a.value() == 12, b.value() == 12
 b.setValue(48);     // a.value() == 12, b.value() == 48
请注意,setValue()函数仅在 value != m_value 时设置值并发出信号。这可以防止循环连接的无限循环(例如,如果b.valueChanged()被连接到a.setValue())。因此,在这种情况下,这是setValue的一项安全功能。这也在setValue函数的文档中有记录:“如果新值与旧值不同,则setValue()将发出valueChanged()信号。”如果你改变滑块的值,它会被发射,这将改变旋钮的值,然后再次发射,现在不会改变滑块的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接