【问题标题】:How does Qt handle a suposedly infinite loop of event emits?Qt 如何处理假定的无限循环的事件发射?
【发布时间】:2014-03-15 00:10:05
【问题描述】:

我同时拥有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)));

我测试过,它可以工作(至少在我的 Ubuntu 12.04 LTS x86_64、g++ 4.6.3、Qt 4.8.1 上)。

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

Obs:我称其为“事件循环循环”,因为这与 Qt Event Loop 无关

【问题讨论】:

    标签: c++ qt signals-slots qt4.8


    【解决方案1】:

    这正是Signals & Slots documentation 中的示例:

     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()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多