How do you prevent these becoming circular? Is it as simple as checking the new value against the current value when the member variable update function is called, and only sending a signal to update the UI if there is a difference?
Yes.
Pragmatically speaking, this allows you to connect, say, a QDial, a QSpinBox and a QSlider and make them stay in sync, without requiring you to do extra magic to prevent infinite loops.
Semantically speaking, have you noticed that the typical signal when a value changes is called valueChanged?
void myClass::setValue(int value) {
if (m_value != value) {
m_value = value;
emit valueChanged(value); // YES, THE VALUE *DID* CHANGE!
}
}
It means that the signal shouldn't be emitted if there's no change of the value, which is what happens if you try to set the value to the current one -- either by setting it directly, or via a signal/slot invokation.