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

fon*_*ini 6 c++ qt signals-slots qt4.8

我有QSliderQSpinBox,我希望它们的值始终相等,所以我将滑块的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)));
Run Code Online (Sandbox Code Playgroud)

我测试了,它的工作原理(至少在我的Ubuntu 12.04 LTS x86_64,g ++ 4.6.3,Qt 4.8.1上).

现在,我认为当我发出其中一个信号时,它会触发另一个信号,这将触发第一个,这将触发另一个,等等.Qt如何处理?是否有描述所用机制的文件?

Obs:我称之为"事件循环发出",因为这与Qt事件循环无关

Zet*_*eta 8

这正是Signals&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
Run Code Online (Sandbox Code Playgroud)

请注意,该setValue()函数仅设置值并发出信号value != m_value.这可以防止在循环连接的情况下无限循环(例如,如果b.valueChanged()连接到a.setValue()).

所以在这种情况下它是一个安全功能setValue.这也记录在setValue函数中:

setValue()valueChanged()如果新值与旧值不同,则会发出.

如果更改滑块中的值,它将发出,这将更改旋转中的值,该值将发出,现在不会更改滑块中的值.