def METHOD_NAME(func):
    # decorator that blocks signal emission during complex operations
    # and emits currentIndexChanged only if the value has actually
    # changed at the end.
    def fn(self, *args, **kwds):
        prevVal = self.value()
        blocked = self.signalsBlocked()
        self.blockSignals(True)
        try:
            ret = func(self, *args, **kwds)
        finally:
            self.blockSignals(blocked)
        # only emit if the value has changed
        if self.value() != prevVal:
            self.currentIndexChanged.emit(self.currentIndex())
        return ret
    return fn