If you don't want to use the checkable property of the button, your only way to achieve this is to keep the status of the animation (e.g., started = true|false) somewhere else, and each time you handle the clicked() signal you manually toggle the animation status. Another way is to provide two different slots, let say animation_start and animation_stop. In each slot you disconnect the slot itself from the signal handling and connect the other one, so each time the button is clicked one of the two slots handles the signal alternatively.