您认为设计信号/插槽交互以更新班级成员值的最佳做法是什么?
例如,考虑在UI上表示的成员变量。 用户更改UI中的值。 存在信号/槽关系以通过成员变量更新函数自动更新成员变量。
我们还希望在UI上自动更新成员变量的更改,因此另一种方式存在信号/插槽关系。在通过更新功能更新成员变量时,信号会触发UI更新。
你如何防止这些成为循环? 它是否像调用成员变量更新函数时检查新值与当前值一样简单,如果存在差异,仅发送信号以更新UI?
或者......有更优雅的方式吗?
答案 0 :(得分:6)
你如何防止这些成为循环?它是否像调用成员变量更新函数时检查新值与当前值一样简单,如果存在差异,仅发送信号以更新UI?
是
从实用的角度来说,这可以让你连接一个QDial,一个QSpinBox和一个QSlider,让它们保持同步,而不需要你做额外的魔法来防止无限循环。
从语义上讲,您是否注意到值更改时的典型信号称为值 已更改 ?
void myClass::setValue(int value) {
if (m_value != value) {
m_value = value;
emit valueChanged(value); // YES, THE VALUE *DID* CHANGE!
}
}
这意味着如果值没有变化则不应发出信号,如果您尝试将值设置为当前值,则会发生这种情况 - 通过直接设置,或通过信号/插槽调用。