Good question, I checked the API and also couldn’t find a signal that would be triggered only if value was modified by user. The workaround you proposed may be the only option, just keep in mind that you don’t have to disconnect / connect all signals, just use QObject::blockSignals method:
slider->blockSignals(true);
slider->setValue(x);
slider->blockSignals(false);
Hope that helps.